snake-hs/app/Main.hs

69 lines
2.2 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"
2026-03-29 19:40:54 +03:00
appLoop renderer texture (initialState (10, 10) (2, 2))
2026-03-28 18:38:00 +03:00
destroyTexture texture
destroyRenderer renderer
destroyWindow window
targetFps :: Word32
2026-03-29 18:39:27 +03:00
targetFps = 2
2026-03-28 18:38:00 +03:00
targetFrameMs :: Word32
targetFrameMs = 1000 `div` targetFps
2026-03-29 18:39:27 +03:00
appLoop :: Renderer -> Texture -> Game -> IO ()
appLoop renderer texture game = do
2026-03-28 18:38:00 +03:00
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
2026-03-29 18:39:27 +03:00
let eventDirectionPressed event = case eventPayload event of
KeyboardEvent keyboardEvent ->
if keyboardEventKeyMotion keyboardEvent == Pressed
then getInputByKeycode $ keysymKeycode (keyboardEventKeysym keyboardEvent)
else NothingPressed
_ -> NothingPressed
input = foldMap eventDirectionPressed events
2026-03-28 18:38:00 +03:00
frameEnd <- getTicks
let elapsed = frameEnd - frameStart
2026-03-29 19:40:54 +03:00
(_, updatedGame) <- runTick game input
2026-03-29 18:39:27 +03:00
renderFrame renderer texture updatedGame
unless exitPressed $ do
delay (targetFrameMs - elapsed)
appLoop renderer texture updatedGame
2026-03-28 18:38:00 +03:00
2026-03-29 18:39:27 +03:00
getInputByKeycode :: Keycode -> MovementInput
getInputByKeycode KeycodeW = UpPressed
getInputByKeycode KeycodeUp = UpPressed
getInputByKeycode KeycodeD = RightPressed
getInputByKeycode KeycodeRight = RightPressed
getInputByKeycode KeycodeS = DownPressed
getInputByKeycode KeycodeDown = DownPressed
getInputByKeycode KeycodeA = LeftPressed
getInputByKeycode KeycodeLeft = LeftPressed
getInputByKeycode _ = NothingPressed