done adding LevelType.level_type as a field of GameType.game_type, and having main loop go through GameUpdate.game_type -> LevelUpdate.update

This commit is contained in:
2025-02-18 13:48:17 +00:00
parent afe878c05d
commit 6b4b637624
7 changed files with 72 additions and 46 deletions

View File

@@ -1,16 +1,20 @@
signature GAME_TYPE = signature GAME_TYPE =
sig sig
datatype mode = datatype mode = LEVEL of LevelType.level_type
LEVEL of LevelType.level_type
type game_type = {userKeys: CoreKey.user_key, mode: mode}
val init: CoreKey.user_key -> game_type
end end
structure GameType :> GAME_TYPE = structure GameType :> GAME_TYPE =
struct struct
datatype mode = datatype mode = LEVEL of LevelType.level_type
LEVEL of LevelType.level_type
type game_type = { type game_type = {userKeys: CoreKey.user_key, mode: mode}
userKeys: CoreKey.user_key,
mode: mode fun init userKeys =
} let val mode = LEVEL LevelType.initial
in {mode = mode, userKeys = userKeys}
end
end end

View File

@@ -0,0 +1,18 @@
structure GameUpdate =
struct
open GameType
fun update (game: GameType.game_type, input) =
let
val {mode, userKeys} = game
val mode =
case mode of
LEVEL level =>
let val level = LevelUpdate.update (level, input)
in LEVEL level
end
in
{mode = mode, userKeys = userKeys}
end
end

View File

@@ -9,10 +9,9 @@ sig
, enemies: EnemyMap.t , enemies: EnemyMap.t
, graph: PlatSet.elem vector vector , graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t , fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
} }
val initial: CoreKey.user_key -> level_type val initial: level_type
end end
structure LevelType :> LEVEL_TYPE = structure LevelType :> LEVEL_TYPE =
@@ -26,7 +25,6 @@ struct
, enemies: EnemyMap.t , enemies: EnemyMap.t
, graph: PlatSet.elem vector vector , graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t , fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
} }
fun enemyMapFromList (hd :: tl, map) = fun enemyMapFromList (hd :: tl, map) =
@@ -35,7 +33,7 @@ struct
end end
| enemyMapFromList ([], map) = map | enemyMapFromList ([], map) = map
fun initial userKeys = val initial =
let let
val player = val player =
{ yAxis = EntityType.JUMPING 0 { yAxis = EntityType.JUMPING 0
@@ -142,7 +140,6 @@ struct
, enemies = enemies , enemies = enemies
, graph = graph , graph = graph
, fallingEnemies = FallingEnemyMap.empty , fallingEnemies = FallingEnemyMap.empty
, userKeys = userKeys
} }
end end
end end

View File

@@ -11,7 +11,6 @@ struct
, enemies , enemies
, graph , graph
, fallingEnemies , fallingEnemies
, userKeys
} = game } = game
val player = Player.runPhysicsAndInput (game, input) val player = Player.runPhysicsAndInput (game, input)
@@ -40,7 +39,6 @@ struct
, enemies = enemies , enemies = enemies
, graph = graph , graph = graph
, fallingEnemies = fallingEnemies , fallingEnemies = fallingEnemies
, userKeys = userKeys
} }
end end
end end

View File

@@ -501,10 +501,7 @@ struct
case attacked of case attacked of
NOT_ATTACKED => (1.0, 1.0, 1.0) NOT_ATTACKED => (1.0, 1.0, 1.0)
| ATTACKED amt => | ATTACKED amt =>
if amt mod 5 = 0 then if amt mod 5 = 0 then (1.0, 1.0, 1.0) else (1.0, 0.75, 0.75)
(1.0, 1.0, 1.0)
else
(1.0, 0.75, 0.75)
in in
PlayerSprite.lerp (x, y, realWidth, realHeight, width, height, r, g, b) PlayerSprite.lerp (x, y, realWidth, realHeight, width, height, r, g, b)
end end

View File

@@ -52,6 +52,7 @@ fcore/level/player/player-attack.sml
fcore/level/projectile.sml fcore/level/projectile.sml
fcore/level/level-update.sml fcore/level/level-update.sml
fcore/game-type.sml
fcore/game-update.sml fcore/game-update.sml
(* shell *) (* shell *)

View File

@@ -213,7 +213,7 @@ struct
fun drawField ({fieldVertexBuffer, fieldProgram, fieldLength, ...}) = fun drawField ({fieldVertexBuffer, fieldProgram, fieldLength, ...}) =
drawXyrgba (fieldVertexBuffer, fieldProgram, fieldLength) drawXyrgba (fieldVertexBuffer, fieldProgram, fieldLength)
fun draw (shellState: t) = fun drawLevel (shellState: t) =
let let
val _ = drawWall shellState val _ = drawWall shellState
val _ = drawPlayer shellState val _ = drawPlayer shellState
@@ -222,6 +222,40 @@ struct
() ()
end end
fun drawMode (shellState: t, game: GameType.game_type) =
let
open GameType
in
case #mode game of
LEVEL level =>
let
val width = InputState.getWidth ()
val height = InputState.getHeight ()
val playerVec = Player.getDrawVec (#player level, width, height)
val enemyVec = Enemy.getDrawVec (#enemies level, width, height)
val playerVec = Vector.concat [playerVec, enemyVec]
val wallVec = Wall.getDrawVec (#walls level, width, height)
val platVec = Platform.getDrawVec (#platforms level, width, height)
val chainVec = Player.getFieldVec (#player level, width, height)
val fallingVec = FallingEnemies.getDrawVec (level, width, height)
val wallVec = Vector.concat [wallVec, platVec, chainVec, fallingVec]
val pelletVec = Player.getPelletVec (#player level, width, height)
val projectileVec =
Projectile.getProjectileVec (#player level, width, height)
val fieldVec = Vector.concat [pelletVec, projectileVec]
val shellState = uploadWall (shellState, wallVec)
val shellState = uploadPlayer (shellState, playerVec)
val shellState = uploadField (shellState, fieldVec)
val () = drawLevel shellState
in
shellState
end
end
fun helpLoop (shellState as {window, ...}: t, game) = fun helpLoop (shellState as {window, ...}: t, game) =
case Glfw.windowShouldClose window of case Glfw.windowShouldClose window of
false => false =>
@@ -230,32 +264,9 @@ struct
val _ = Gles3.clear () val _ = Gles3.clear ()
val input = InputState.getSnapshot () val input = InputState.getSnapshot ()
val width = InputState.getWidth () val game = GameUpdate.update (game, input)
val height = InputState.getHeight ()
val game = LevelUpdate.update (game, input) val shellState = drawMode (shellState, game)
val playerVec = Player.getDrawVec (#player game, width, height)
val enemyVec = Enemy.getDrawVec (#enemies game, width, height)
val playerVec = Vector.concat [playerVec, enemyVec]
val wallVec = Wall.getDrawVec (#walls game, width, height)
val platVec = Platform.getDrawVec (#platforms game, width, height)
val chainVec = Player.getFieldVec (#player game, width, height)
val fallingVec = FallingEnemies.getDrawVec (game, width, height)
val wallVec = Vector.concat [wallVec, platVec, chainVec, fallingVec]
(* temp *)
val pelletVec = Player.getPelletVec (#player game, width, height)
val projectileVec =
Projectile.getProjectileVec (#player game, width, height)
val fieldVec = Vector.concat [pelletVec, projectileVec]
val shellState = uploadWall (shellState, wallVec)
val shellState = uploadPlayer (shellState, playerVec)
val shellState = uploadField (shellState, fieldVec)
val _ = draw shellState
val _ = Glfw.swapBuffers window val _ = Glfw.swapBuffers window
val _ = Glfw.pollEvents () val _ = Glfw.pollEvents ()
@@ -281,6 +292,6 @@ struct
val () = InputState.setControls controls val () = InputState.setControls controls
in in
helpLoop (shellState, LevelType.initial controls) helpLoop (shellState, GameType.init controls)
end end
end end