This is a package for running a game loop in a browser in purescript using
window.requestAnimationFrame
.
It has a type alias called Game
which is a record containing various functions
needed to run your game loop.
It looks like this:
type Game state return =
{ gameWindow :: Window
, init :: Effect state
, update :: Seconds -> state -> Effect state
, display :: state -> Effect Unit
, end :: state -> Maybe (Either Error return)
, events :: List (GameEvent state)
}
state
is the type of the state used in your game. This will most likely be a
record type containing all the different values your game needs.
return
is the type of the value that will be returned by the Aff
your game
is run in, if and when it terminates.
gameWindow :: Window
is the browser window your game runs in. To get the
current window your code is running in, use window
from Web.HTML
.
init :: Effect state
is the initial state of your game. It is wrapped in
Effect
so that it is possible for the initial state to depend on random
number generation, database queries and other things.
update :: Seconds -> state -> Effect state
is the state update function that
will be run every frame. It takes a value of type Seconds
, which is the time
since the last frame, and a value of type state
, which is the state of the
game before the current frame started. It needs to return a value of type
Effect state
, where the containted state
will be the state of the game after
the frame.
display :: state -> Effect Unit
is the function that is used to render your
game. Given the state of the game, it needs to return an Effect Unit
, which
should display the game in some way. This is usually drawing on a HTML5 canvas,
manipulating the DOM, or logging to the console. This function is run right
after update
.
end :: state -> Maybe (Either Error return)
is the function that is used to
determine whether to terminate the game loop. It is run after every frame. Given
the current state, if it returns Nothing
, the game loop will keep running for
another frame. If it returns a Just
, the game loop will end. If the inner
value is an Error
, the Aff
will error, and if the inner value is of type
return
, it will resolve the Aff
with that value.
events :: List (GameEvent state)
is a list of events watched by the game.
The type alias GameEvent
is used to represent these events. It looks like
this:
type GameEvent state =
{ eventType :: EventType
, target :: EventTarget
, update :: Event -> state -> Effect state
, useCapture :: Boolean
}
eventType :: EventType
is the type of the event, see EventType
.
target :: EventTarget
is the event target, see EventTarget
.
update :: Event -> state -> Effect state
is the function that gets run when
the event occurs. It takes the Event
object and the current state, and returns
a new state, wrapped in Effect
.
useCapture :: Boolean
specifies whether to use capture, see
EventTarget.addEventListener
.
Use game
to create an Aff
from a Game
value. From there, you can use
launchAff_
from Effect.Aff
to run the Aff
in an Effect
. Other ways to run an Aff
and more info can
be found here.
Module reference is published on Pursuit.