首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Gloss中实现多个层次?

如何在Gloss中实现多个层次?
EN

Stack Overflow用户
提问于 2022-07-02 04:29:06
回答 2查看 115关注 0票数 2

我正试图在Haskell中实现一个多层次的游戏。每个级别都有不同的但广义的博弈状态。我们可以定义游戏状态如下-

代码语言:javascript
复制
type Player = (Float, Float) -- Player coordinates
data State a = State Player a Bool

在这里,a是环境。在一个级别上,它被定义为String,而在另一个级别,它被定义为([Int], [Int])。Bool确定级别是否完成。

我实现了两个不同的函数,它们使用来自playGraphics.Gloss.Interface.Pure.Game。我可以将这些函数中的任何一个注入到main中,并分别播放它们。例如-

代码语言:javascript
复制
lv1 = play window black 90 (State (0,0) "Hello" False) drawLv1 handleLv1 updateLv1
lv2 = play window black 90 (State (0,0) ([1,2,3,4], [0,0,0,0]) False) drawLv2 handleLv2 updateLv2

main :: IO()
main = lv1
-- main = lv2

但是,我想从lv1转到lv2。我知道Haskell函数可以作为值传递,显然有一种方法可以将主函数从lv1更改为lv2,但我无法理解这一点。

一个解决方案,或者是一个关于如何推广和正确处理这个问题的想法,将是非常好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-06 13:57:39

我决定写我最后是如何解决这个问题的,因为其他人可能面临着和我一样的问题-

首先,我更改了State数据,使其成为一个更好地在不同级别之间进行转换的通用系统。因此,与当前的State a数据不同,我现在有了State,但是有了一个新的参数Level

代码语言:javascript
复制
type Player = (Float, Float) -- Player coordinates
-- data State a = State Player a Bool
data State = State {
    getPlayer :: Player,
    getLevel :: Level,
    levelCompleted :: Bool
}
data Level = Lv1 String | Lv2 ([Int], [Int])

然后,我需要相应地修复特定于级别的函数。例如-

代码语言:javascript
复制
updateLv1 :: Float -> State -> State
-- If com is true then level is complete
updateLv1 _ (State player (Lv1 st) com) =
    if com then State (0,0) ([1,2,3,4], [0,0,0,0]) False
    else
        ...
        ...

updateLv1 time state = commonUpdater time state

绘图和事件处理程序也是如此。

最后我不得不修复那些普通的处理程序-

代码语言:javascript
复制
commonUpdater time state = case getLevel state of
    Lv1 _ = updateLv1 time state
    Lv2 _ = updateLv2 time state

我还必须实现commonHandlercommonDrawer。这个过程几乎是一样的。

最后,游戏功能变得简单了。我只需初始化Lv1状态,rest将由公共函数处理-

代码语言:javascript
复制
game :: IO()
game = play window black 90 (State (0,0) (Lv2 "Hello") False) commonDrawer commonHandler commonUpdater

main :: IO()
main = game

就这样!

票数 1
EN

Stack Overflow用户

发布于 2022-07-02 12:55:21

当您说级别可以有不同的类型时,您玩这些级别的游戏代码必须解释和修改此状态值。因此,游戏中必须有从String到某些类型的函数,以及从([Int], [Int])到相同类型的等效函数。

如果是这样,那么您需要将这些函数放在一个类中:

代码语言:javascript
复制
class MyGameState a where
   someFunction :: a -> Int
   someOtherFunction :: a -> Thing
   updateGameState :: Int -> a -> a

instance MyGameState String where
   someFunction str = .....
   someOtherFunction str = ......
   updateGameState n oldState = ......

instance MyGameState ([Int],[Int])也是如此。然后,您可以使用someFunctionsomeOtherFunction定义您的游戏功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72836446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档