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 =
sig
datatype mode =
LEVEL of LevelType.level_type
datatype mode = LEVEL of LevelType.level_type
type game_type = {userKeys: CoreKey.user_key, mode: mode}
val init: CoreKey.user_key -> game_type
end
structure GameType :> GAME_TYPE =
struct
datatype mode =
LEVEL of LevelType.level_type
datatype mode = LEVEL of LevelType.level_type
type game_type = {
userKeys: CoreKey.user_key,
mode: mode
}
type game_type = {userKeys: CoreKey.user_key, mode: mode}
fun init userKeys =
let val mode = LEVEL LevelType.initial
in {mode = mode, userKeys = userKeys}
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
, graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
}
val initial: CoreKey.user_key -> level_type
val initial: level_type
end
structure LevelType :> LEVEL_TYPE =
@@ -26,7 +25,6 @@ struct
, enemies: EnemyMap.t
, graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
}
fun enemyMapFromList (hd :: tl, map) =
@@ -35,7 +33,7 @@ struct
end
| enemyMapFromList ([], map) = map
fun initial userKeys =
val initial =
let
val player =
{ yAxis = EntityType.JUMPING 0
@@ -142,7 +140,6 @@ struct
, enemies = enemies
, graph = graph
, fallingEnemies = FallingEnemyMap.empty
, userKeys = userKeys
}
end
end

View File

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

View File

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

View File

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

View File

@@ -213,7 +213,7 @@ struct
fun drawField ({fieldVertexBuffer, fieldProgram, fieldLength, ...}) =
drawXyrgba (fieldVertexBuffer, fieldProgram, fieldLength)
fun draw (shellState: t) =
fun drawLevel (shellState: t) =
let
val _ = drawWall shellState
val _ = drawPlayer shellState
@@ -222,6 +222,40 @@ struct
()
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) =
case Glfw.windowShouldClose window of
false =>
@@ -230,32 +264,9 @@ struct
val _ = Gles3.clear ()
val input = InputState.getSnapshot ()
val width = InputState.getWidth ()
val height = InputState.getHeight ()
val game = GameUpdate.update (game, input)
val game = LevelUpdate.update (game, input)
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 shellState = drawMode (shellState, game)
val _ = Glfw.swapBuffers window
val _ = Glfw.pollEvents ()
@@ -281,6 +292,6 @@ struct
val () = InputState.setControls controls
in
helpLoop (shellState, LevelType.initial controls)
helpLoop (shellState, GameType.init controls)
end
end