HGE2D-0.1.6.0: src/examples/Example3.hs
module Main where
import HGE2D.Types
import HGE2D.Datas
import HGE2D.Colors
import HGE2D.Classes
import HGE2D.Instances ()
import HGE2D.Shapes
import HGE2D.Render
import HGE2D.Engine
{- Example showing dynamic changes by moving the rectanlge -}
--------------------------------------------------------------------------------
--in here we are going to store all data of the game
data GameState = GameState
{ gsSize :: (Double, Double) -- current size of the entire game in pixels
, time :: Millisecond -- current time of the game
, isClicked :: Bool -- whether the rectangle has been clicked
, moveUp :: Bool -- whether the rectangle is moving up
, pos :: RealPosition -- the position of the rectangle
}
--define our initial state
gs3 = GameState
{ time = 0
, gsSize = (0, 0)
, pos = (0, 0)
, isClicked = False
, moveUp = False
}
--define all functions of the engine for usage of our state
es3 = EngineState
{ getTitle = myGetTitle
, getTime = myGetTime
, setTime = mySetTime
, moveTime = myMoveTime
, click = myClick
, mUp = myMouseUp
, hover = myHover
, drag = myDrag
, kDown = myKeyDown
, kUp = myKeyUp
, resize = myResize
, getSize = myGetSize
, toGlInstr = myToGlInstr
} :: EngineState GameState
where
myGetTitle _ = "Welcome to Example3" --title of the games window
myGetTime = time -- how to retrieve the games time
mySetTime ms gs = gs { time = ms } -- how to set the games time
myMoveTime ms gs = gs { pos = newPos, moveUp = newMoveUp } -- react to changes in time by moving the position
where
newMoveUp | snd oldPos < 1 && moveUp gs = False
| snd oldPos > (snd $ gsSize gs) && (not (moveUp gs)) = True
| otherwise = moveUp gs
newPos | moveUp gs = ((fst oldPos), (snd oldPos - realToFrac ms / 30))
| otherwise = ((fst oldPos), (snd oldPos + realToFrac ms / 10))
oldPos = pos gs
myClick _ _ gs = gs { isClicked = not $ isClicked gs } -- toggle the isClicked Bool on click
myMouseUp _ _ = id --nor mouse up
myHover x y gs = gs { pos = (x, y) } -- store the hover position
myDrag _ _ gs = gs -- don't react to draging
myKeyDown _ _ _ = id -- nor key presses
myKeyUp _ _ _ = id --nor key releases
myResize (w, h) gs = gs { gsSize = (realToFrac w, realToFrac h) } -- how to resize our game
myGetSize = gsSize -- and get its size
myToGlInstr gs = withCamera es3 gs $ RenderPreserve $ RenderMany -- render with a camera and while preserving changes
[ RenderColorize color -- a colored
, RenderTranslate (realToFrac $ getX $ pos gs) (realToFrac $ getY $ pos gs) -- moved to pos
, rectangle 30 30 -- rectangle of 30px with and height
]
where -- the color of the rectangle depends on the click state
color | isClicked gs = colorWhite
| otherwise = colorGreen
--------------------------------------------------------------------------------
main = runEngine es3 gs3