snake-hs/app/Main.hs

49 lines
1.3 KiB
Haskell
Raw Normal View History

2026-03-24 15:40:22 +03:00
module Main where
2026-03-28 18:38:00 +03:00
import SDL
import qualified SDL.Image as IMG
import qualified Data.Text as Text
import Control.Monad (unless)
import Graphics
import SnakeLib
import SDL.Raw (getTicks)
import Data.Word (Word32)
2026-03-24 15:40:22 +03:00
main :: IO ()
main = do
2026-03-28 18:38:00 +03:00
initializeAll
window <- createWindow (Text.pack "Hello, World") defaultWindow
renderer <- createRenderer window (-1) defaultRenderer
texture <- IMG.loadTexture renderer "assets/spritesheet.png"
appLoop renderer texture
destroyTexture texture
destroyRenderer renderer
destroyWindow window
targetFps :: Word32
targetFps = 60
targetFrameMs :: Word32
targetFrameMs = 1000 `div` targetFps
appLoop :: Renderer -> Texture -> IO ()
appLoop renderer texture = do
frameStart <- getTicks
events <- pollEvents
let eventIsExitPress event = case eventPayload event of
KeyboardEvent keyboardEvent ->
keyboardEventKeyMotion keyboardEvent == Pressed &&
keysymKeycode (keyboardEventKeysym keyboardEvent) == KeycodeQ
WindowClosedEvent _ -> True
_ -> False
exitPressed = any eventIsExitPress events
renderFrame renderer texture
frameEnd <- getTicks
let elapsed = frameEnd - frameStart
delay (targetFrameMs - elapsed)
unless exitPressed (appLoop renderer texture)