{-# LANGUAGE BangPatterns #-} {-# LANGUAGE ViewPatterns #-} -- | module Main where import Control.Concurrent import Control.Monad import Data.List.Split import Data.Monoid import qualified Data.Text as T import Options.Applicative.Simple import SDL import qualified SDL.Sprite import Text.Read main :: IO () main = do ((fp, dim, ms), ()) <- simpleOptions "0.0.0" "sdl2-sprite" "Animate sprites with sdl2" ((,,) <$> argument str (metavar "FILE") <*> argument (eitherReader (\i -> case splitOn "x" i of [w, h] -> V2 <$> readEither w <*> readEither h _ -> Left "invalid WIDTHxHEIGHT specification")) (metavar "WIDTHxHEIGHT") <*> (fmap (\fps -> 1000 / fps) (option auto (long "fps" <> value (15 :: Double) <> help "Frames per second")) <|> option auto (long "delay" <> value (50 :: Double) <> help "Delay between frames in ms"))) empty initializeAll window <- createWindow (T.pack fp) defaultWindow {windowInitialSize = dim, windowHighDPI = True} renderer <- createRenderer window (-1) defaultRenderer -- Resize the window (smaller) if in high DPI (retina) mode. do Just (Rectangle _ (V2 w h)) <- SDL.get (SDL.rendererViewport renderer) let scale = let (V2 w0 h0) = dim in (V2 (fromIntegral w / fromIntegral w0 :: Double) (fromIntegral h / fromIntegral h0 :: Double)) windowSize window $= (fmap round (fmap fromIntegral dim / scale)) -- Load up the sprite. sprite0 <- SDL.Sprite.load renderer fp dim -- Render the sprite on a timer. let loop (!sprite) = do events <- pollEvents let eventQuit event = case eventPayload event of KeyboardEvent keyboardEvent -> keyboardEventKeyMotion keyboardEvent == Pressed && keysymKeycode (keyboardEventKeysym keyboardEvent) == KeycodeQ WindowClosedEvent {} -> True _ -> False clear renderer SDL.Sprite.render sprite (V2 0 0) present renderer threadDelay (round (1000 * ms)) unless (any eventQuit events) (loop (SDL.Sprite.animate sprite)) loop sprite0