繁体   English   中英

如何在Haskell中编写游戏循环?

[英]How do I write a game loop in Haskell?

我想在Haskell中编写游戏代码,其中循环的每次迭代都会计算出世界的状态。 我以为我应该创建一个函数:

gameLoop :: World -> World
-- ...

并让main :: IO ()调用它:

main = do
    gameLoop -- ...

但问题是我缺少一些基本的理解如何包装gameLoop函数,以便它返回main的参数值。

如何在Haskell中创建游戏循环?

你可能想要这样的东西

import Control.Monad.Loops

main = iterateM_ 
       (\w -> displayWorld w >> return (gameLoop w))
       initWorld
-- iterateM_ ((>>) <$> displayWorld <*> return . gameLoop) initWorld

或者,如果你不想使用整个monad-loops包(即使它摇滚)

main = loop initWorld
  where loop w = displayWorld w >> loop (gameLoop w)

基本上你只是画世界,然后再次循环到下一个状态。

你更想要这样的东西

 -- False when the user wants to exit the game
 keepGoing :: World -> Bool

 main = iterateUntilM_ keepGoing displayLoop initWorld
   where displayLoop w = displayWorld w >> return (gameLoop w)

因为否则你不能停止:)

我认为你宣称的是一个状态转换函数,游戏循环本身应该是一个递归函数。 总体思路如下:

initialState :: World
nextState :: World -> World
isFinalState :: World -> Bool

gameLoop world | isFinalState world = -- ...
               | otherwise = do
                     drawScene world
                     gameLoop (nextState world)

main = gameLoop initialState

initialState ,可以使用初始参数等构建初始世界。在nextState您可以处理将改变世界状态的玩家输入(键盘等)。 isFinalState用于检测是否应退出游戏循环。

这种结构有点类似于Erlang中经常使用的结构,例如查询Erlang进程的状态?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM