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)
|
|
|
|
|
|