Как мне написать игровой цикл в Хаскеле?
Я хочу написать игру на Хаскеле, где каждая итерация цикла вычисляет состояние мира. Я думал, что я должен создать функцию:
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 для его состояния?