packages feed

brillo-1.13.3: Brillo/Interface/IO/Game.hs

{-# LANGUAGE ExplicitForAll #-}

{-| This game mode lets you manage your own input. Pressing ESC will not abort the program.
  You also don't get automatic pan and zoom controls like with `display`.
-}
module Brillo.Interface.IO.Game (
  module Brillo.Data.Display,
  module Brillo.Data.Picture,
  module Brillo.Data.Color,
  playIO,
  Event (..),
  Key (..),
  SpecialKey (..),
  MouseButton (..),
  KeyState (..),
  Modifiers (..),
)
where

import Brillo.Data.Color
import Brillo.Data.Display
import Brillo.Data.Picture
import Brillo.Internals.Interface.Backend
import Brillo.Internals.Interface.Game


-- | Play a game in a window, using IO actions to build the pictures.
playIO
  :: forall world
   . Display
  -- ^ Display mode.
  -> Color
  -- ^ Background color.
  -> Int
  -- ^ Number of simulation steps to take for each second of real time.
  -> world
  -- ^ The initial world.
  -> (world -> IO Picture)
  -- ^ An action to convert the world a picture.
  -> (Event -> world -> IO world)
  -- ^ A function to handle input events.
  -> (Float -> world -> IO world)
  -- ^ A function to step the world one iteration.
  --   It is passed the period of time (in seconds) needing to be advanced.
  -> IO ()
playIO
  display
  backColor
  simResolution
  worldStart
  worldToPicture
  worldHandleEvent
  worldAdvance =
    playWithBackendIO
      defaultBackendState
      display
      backColor
      simResolution
      worldStart
      worldToPicture
      worldHandleEvent
      worldAdvance
      False