{-| Module : Pong Description : GameState management Copyright : (c) Truong Dung, 2017 License : GPL-3 Maintainer : checkraiser11@gmail.com Stability : experimental Portability : POSIX -} module Pong( PongGame, ballLoc, ballVel, render, initialState ) where import Graphics.Gloss -- | Data describing the state of the pong game data PongGame = Game { ballLoc :: (Float, Float) -- ^ Pong ball (x, y) location , ballVel :: (Float, Float) -- ^ Pong ball (x, y) velocity , player1 :: Float -- ^ Left player paddle height , player2 :: Float -- ^ Right player } deriving Show -- | The initial state for the game of Pong initialState :: PongGame initialState = Game { ballLoc = (-10, 30) , ballVel = (1, -10) , player1 = 40 , player2 = -80 } -- | Convert a game state into a picture render :: PongGame -- ^ The game state to render. -> Picture -- ^ A picture of this game state. render game = pictures [ball, walls, mkPaddle rose 120 $ player1 game, mkPaddle orange (-120) $ player2 game] where -- the pong ball. ball = uncurry translate (ballLoc game) $ color ballColor $ circleSolid 10 ballColor = dark red -- the bottom and top walls. wall :: Float -> Picture wall offset = translate 0 offset $ color wallColor $ rectangleSolid 270 10 wallColor = greyN 0.5 walls = pictures [wall 150, wall (-150)] -- make a paddle of a given border and vertical offset. mkPaddle :: Color -> Float -> Float -> Picture mkPaddle col x y = pictures [ translate x y $ color col $ rectangleSolid 26 86 , translate x y $ color paddleColor $ rectangleSolid 20 80 ] paddleColor = light $ light blue