1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
module Lazyfoo.Lesson04 (main) where
import Prelude hiding (any, mapM_)
import Control.Monad hiding (mapM_)
import Data.Foldable hiding (elem)
import Data.Maybe
import Data.Monoid
import Foreign.C.Types
import SDL.Vect
import qualified SDL
import Paths_sdl2 (getDataFileName)
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
screenWidth, screenHeight :: CInt
(screenWidth, screenHeight) = (640, 480)
loadBMP :: FilePath -> IO SDL.Surface
loadBMP path = getDataFileName path >>= SDL.loadBMP
main :: IO ()
main = do
SDL.initialize [SDL.InitVideo]
window <- SDL.createWindow "SDL Tutorial" SDL.defaultWindow { SDL.windowInitialSize = V2 screenWidth screenHeight }
SDL.showWindow window
screenSurface <- SDL.getWindowSurface window
surfaceDefault <- loadBMP "examples/lazyfoo/press.bmp"
surfaceUp <- loadBMP "examples/lazyfoo/up.bmp"
surfaceDown <- loadBMP "examples/lazyfoo/down.bmp"
surfaceLeft <- loadBMP "examples/lazyfoo/left.bmp"
surfaceRight <- loadBMP "examples/lazyfoo/right.bmp"
let
loop oldSurface = do
events <- map SDL.eventPayload <$> SDL.pollEvents
let quit = SDL.QuitEvent `elem` events
currentSurface =
fromMaybe oldSurface $ getLast $
foldMap (\case SDL.KeyboardEvent e
| SDL.keyboardEventKeyMotion e == SDL.Pressed ->
case SDL.keysymKeycode (SDL.keyboardEventKeysym e) of
SDL.KeycodeUp -> Last (Just surfaceUp)
SDL.KeycodeDown -> Last (Just surfaceDown)
SDL.KeycodeRight -> Last (Just surfaceRight)
SDL.KeycodeLeft -> Last (Just surfaceLeft)
_ -> mempty
_ -> mempty)
events
void $ SDL.surfaceBlit currentSurface Nothing screenSurface Nothing
SDL.updateWindowSurface window
unless quit (loop currentSurface)
loop surfaceDefault
mapM_ SDL.freeSurface [ surfaceDefault, surfaceUp, surfaceDown, surfaceRight, surfaceLeft ]
SDL.destroyWindow window
SDL.quit
|