{-# LANGUAGE CPP #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE OverloadedStrings #-} module Lazyfoo.Lesson18 (main) where import Prelude hiding (any, mapM_) import Control.Monad hiding (mapM_) import Data.Foldable hiding (elem) import Data.Maybe import Foreign.C.Types import SDL.Vect import SDL (($=)) 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) data Texture = Texture SDL.Texture (V2 CInt) loadTexture :: SDL.Renderer -> FilePath -> IO Texture loadTexture r filePath = do surface <- getDataFileName filePath >>= SDL.loadBMP size <- SDL.surfaceDimensions surface let key = V4 0 maxBound maxBound maxBound SDL.surfaceColorKey surface $= Just key t <- SDL.createTextureFromSurface r surface SDL.freeSurface surface return (Texture t size) renderTexture :: SDL.Renderer -> Texture -> Point V2 CInt -> Maybe (SDL.Rectangle CInt) -> Maybe CDouble -> Maybe (Point V2 CInt) -> Maybe (V2 Bool) -> IO () renderTexture r (Texture t size) xy clip theta center flips = let dstSize = maybe size (\(SDL.Rectangle _ size') -> size') clip in SDL.copyEx r t clip (Just (SDL.Rectangle xy dstSize)) (fromMaybe 0 theta) center (fromMaybe (pure False) flips) main :: IO () main = do SDL.initialize [SDL.InitVideo] SDL.HintRenderScaleQuality $= SDL.ScaleLinear do renderQuality <- SDL.get SDL.HintRenderScaleQuality when (renderQuality /= SDL.ScaleLinear) $ putStrLn "Warning: Linear texture filtering not enabled!" window <- SDL.createWindow "SDL Tutorial" SDL.defaultWindow {SDL.windowInitialSize = V2 screenWidth screenHeight} SDL.showWindow window renderer <- SDL.createRenderer window (-1) SDL.RendererConfig { SDL.rendererType = SDL.AcceleratedVSyncRenderer , SDL.rendererTargetTexture = False } SDL.rendererDrawColor renderer $= V4 maxBound maxBound maxBound maxBound pressTexture <- loadTexture renderer "examples/lazyfoo/press.bmp" upTexture <- loadTexture renderer "examples/lazyfoo/up.bmp" downTexture <- loadTexture renderer "examples/lazyfoo/down.bmp" leftTexture <- loadTexture renderer "examples/lazyfoo/left.bmp" rightTexture <- loadTexture renderer "examples/lazyfoo/right.bmp" let loop = do events <- map SDL.eventPayload <$> SDL.pollEvents let quit = SDL.QuitEvent `elem` events keyMap <- SDL.getKeyboardState let texture = if | keyMap SDL.ScancodeUp -> upTexture | keyMap SDL.ScancodeDown -> downTexture | keyMap SDL.ScancodeLeft -> leftTexture | keyMap SDL.ScancodeRight -> rightTexture | otherwise -> pressTexture SDL.rendererDrawColor renderer $= V4 maxBound maxBound maxBound maxBound SDL.clear renderer renderTexture renderer texture 0 Nothing Nothing Nothing Nothing SDL.present renderer unless quit loop loop SDL.destroyWindow window SDL.quit