2

最初に注意してください。問題が正確に何であるかがわからないため、この質問にタイトルを付ける方法がわかりません。

私はHaskell + SDLを少しいじっていて、立ち往生しています。私の GitHub リポジトリはこちら: https://github.com/kennycason/haskell_boxxle/

209 行目に次のコード行があります。

quit <- whileEvents $ modifyPlayerPos . handleKeyboard

プレーヤーだけを移動するだけで機能しますが、保存されている他のコンテンツ、つまり(つまり)GameDataに保存されているデータも変更できるようにしたいですRoomboxes = [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など) 内の他の値に対して行ったように関数を記述する方法もわかりません。

handleKeyboard に渡したい型を示すために、コピーして変更handleKeyboardしました。handleKeyboard2

私はモナドと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 に答える