Как мне написать игровой цикл в Хаскеле?

Я хочу написать игру на Хаскеле, где каждая итерация цикла вычисляет состояние мира. Я думал, что я должен создать функцию:

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

и имеют main :: IO () назови это:

main = do
    gameLoop -- ...

Но проблема в том, что мне не хватает фундаментального понимания того, как обернуть gameLoop функционировать так, чтобы он возвращал mainЗначение параметра.

Как можно было бы создать игровой цикл в Haskell?

2 ответа

Решение

Вы, вероятно, захотите что-то подобное

import Control.Monad.Loops

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

Или, если вы не хотите использовать весь пакет monad-loop (даже если он качается)

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 для его состояния?

Другие вопросы по тегам