module Bouncy where import GraphicsUtils data Ball = Ball { p :: Point, v :: Point } drawBall :: Ball-> Graphic drawBall (Ball {p= (x, y)}) = withColor Red (ellipse (x- 10, y-10) (x+10, y+10)) move :: Ball-> Ball move (Ball {p= (px, py), v= (vx, vy)})= Ball {p= (px', py'), v= (vx, vy')} where px' = (px+ vx) `mod` 500 py0 = py+ vy py' = if py0> 500 then 500-(py0-500) else py0 vy' = (if py0> 500 then -vy else vy)+ 1 main :: IO () main = runGraphics $ do w<- openWindowEx "Bounce!" Nothing (500, 500) DoubleBuffered (Just 30) loop w (Ball{p=(0, 10), v= (5, 0)}) where loop :: Window-> Ball-> IO () loop w b = do setGraphic w (drawBall b) getWindowTick w loop w (move b)