import Game import qualified Graphics.Shine as S import qualified Graphics.Shine.Input as S import qualified Graphics.Shine.Picture as S import qualified Web.KeyCode as W import System.Random (newStdGen, randoms) import GHCJS.DOM (currentDocumentUnchecked) displayH :: Game -> S.Picture displayH g = S.Translate width2 height2 $ case _status g of Won -> S.Text "50px Sans" S.CenterAlign Nothing "YOU WIN!" Lost -> S.Text "50px Sans" S.CenterAlign Nothing "GAME OVER!" _ -> S.Rotate pi $ foldl (<>) paddle (bullets ++ invaders) where paddle = drawItem (S.Color 0 127 0 1) (_paddle g) bullets = map (drawItem (S.Color 0 0 255 1)) (_bullets g) invaders = map (drawItem (S.Color 255 0 0 1)) (_invaders g) width2 = fromIntegral $ div gameWidth 2 height2 = fromIntegral $ div gameHeight 2 drawItem :: S.Color -> Item -> S.Picture drawItem c it = S.Colored c $ S.Translate x y $ S.RectF sx sy where (x, y) = _pos it (sx, sy) = _siz it eventH :: S.Input -> Game -> Game eventH (S.Keyboard W.ArrowLeft S.Down _) g = g { _inputRight = True } eventH (S.Keyboard W.ArrowLeft S.Up _) g = g { _inputRight = False } eventH (S.Keyboard W.ArrowRight S.Down _) g = g { _inputLeft = True } eventH (S.Keyboard W.ArrowRight S.Up _) g = g { _inputLeft = False } eventH (S.Keyboard W.Space S.Down _) g = g { _inputFire = True } eventH (S.Keyboard W.Space S.Up _) g = g { _inputFire = False } eventH _ g = g idleH :: Double -> Game -> Game idleH = step main :: IO () main = do myRands <- randoms <$> newStdGen doc <- currentDocumentUnchecked ctx <- S.fixedSizeCanvas doc 800 600 let model0 = createGame myRands S.play ctx doc 30 model0 displayH eventH idleH