2

首先请注意,我不确定如何命名这个问题,因为我不知道到底是什么问题。

我一直在玩 Haskell+SDL 并且被卡住了。我的 GitHub 存储库在这里:https ://github.com/kennycason/haskell_boxxle/

在第 209 行有一行代码:

quit <- whileEvents $ modifyPlayerPos . handleKeyboard

它只能移动播放器,但我真的希望能够修改存储的其他内容GameData,即存储在Room(即boxes = [Coord])中的数据

我通过以下方式开始循环:

runLoop :: GameConfig -> GameData -> IO ()
runLoop = evalStateT . runReaderT loop


main = withInit [InitEverything] $ do -- withInit calls quit for us.
    (gConf, gData) <- newGame 1
    runLoop gConf gData

但是在我进入循环之后,我真的不知道如何gData再次获得访问权限,或者即使我知道了,如何编写modify函数,就像我为 GameData (modifyPlayerPos等) 中的其他值所做的那样。

我复制并修改handleKeyboardhandleKeyboard2以演示我想要传递给 handleKeyboard 的类型。

我还是 Monads 和 Haskell 的新手,所以我很感激任何建议。如果我的问题不够清楚,请告诉我。谢谢!

4

1 回答 1

2

在论坛上进行了一番讨论后(感谢 donri),我能够弄清楚如何正确编写我的 get/put/modify 状态函数:

getGameData :: MonadState GameData m => m GameData
getGameData = get -- This line is what I couldn't figure out!

putGameData :: MonadState GameData m => GameData -> m ()
putGameData = put

modifyGameData :: MonadState GameData m => (GameData -> GameData) -> m ()
modifyGameData = modify
于 2013-10-10T10:32:39.147 回答