update state of falling enemies per loop

This commit is contained in:
2025-02-08 09:49:32 +00:00
parent 38640b14a2
commit 51401231e1
5 changed files with 73 additions and 19 deletions

View File

@@ -405,12 +405,7 @@ struct
* fallingEnemies *) * fallingEnemies *)
let let
val fallingList = val fallingList =
{ falling = false {x = x, y = y, variant = #variant enemy, jumped = 0} :: fallingList
, x = x
, y = y
, variant = #variant enemy
, jumped = 0
} :: fallingList
in in
(enemyList, fallingList) (enemyList, fallingList)
end end
@@ -457,12 +452,7 @@ struct
* fallingEnemies *) * fallingEnemies *)
let let
val fallingList = val fallingList =
{ falling = false {x = x, y = y, variant = #variant enemy, jumped = 0} :: fallingList
, x = x
, y = y
, variant = #variant enemy
, jumped = 0
} :: fallingList
in in
(enemyList, fallingList) (enemyList, fallingList)
end end

View File

@@ -0,0 +1,61 @@
structure FallingEnemies =
struct
open GameType
fun helpGenerateTree (pos, fallingVec: falling_enemy vector, acc) =
if pos = Vector.length fallingVec then
acc
else
let
val {x, y, ...} = Vector.sub (fallingVec, pos)
val size = Constants.enemySize
val acc = QuadTree.insert (x, y, size, size, pos + 1, acc)
in
helpGenerateTree (pos + 1, fallingVec, acc)
end
fun generateTree fallingVec =
helpGenerateTree
( 0
, fallingVec
, QuadTree.create (Constants.worldWidth, Constants.worldHeight)
)
fun updateList (pos, vec, acc) =
if pos < 0 then
acc
else
let
val {x, y, jumped, variant} = Vector.sub (vec, pos)
val size = Constants.enemySize
val ww = Constants.worldWidth
val wh = Constants.worldHeight
in
if Collision.isColliding (x, y, size, size, 0, 0, ww, wh) then
(* move falling enemy up or down depending on jumped *)
let
val updated =
if jumped < Constants.jumpLimit then
{ x = x
, y = y - Constants.moveEnemyBy
, jumped = jumped + Constants.moveEnemyBy
, variant = variant
}
else
{ x = x
, y = y + Constants.moveEnemyBy
, jumped = jumped
, variant = variant
}
in
updateList (pos - 1, vec, updated :: acc)
end
else
(* if current is not colliding with world's bounds, then filter out
* as it is off screen *)
updateList (pos - 1, vec, acc)
end
end

View File

@@ -58,8 +58,7 @@ sig
, nextPlatID: int , nextPlatID: int
} }
type falling_enemy = type falling_enemy = {x: int, y: int, variant: EnemyVariants.t, jumped: int}
{falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int}
type game_type = type game_type =
{ player: player { player: player
@@ -136,8 +135,7 @@ struct
, nextPlatID: int , nextPlatID: int
} }
type falling_enemy = type falling_enemy = {x: int, y: int, variant: EnemyVariants.t, jumped: int}
{falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int}
type game_type = type game_type =
{ player: player { player: player

View File

@@ -19,7 +19,11 @@ struct
val projectiles = #projectiles player val projectiles = #projectiles player
val projectileTree = Projectile.generateTree projectiles val projectileTree = Projectile.generateTree projectiles
val (enemies, newFallingEnemies) = Enemy.updateEnemyList (* update state of falling enemies and possibly filter *)
val fallingEnemies = FallingEnemies.updateList
(Vector.length fallingEnemies - 1, fallingEnemies, [])
val (enemies, fallingEnemies) = Enemy.updateEnemyList
( Vector.length enemies - 1 ( Vector.length enemies - 1
, enemies , enemies
, projectiles , projectiles
@@ -31,10 +35,10 @@ struct
, player , player
, graph , graph
, [] , []
, [] , fallingEnemies
) )
val fallingEnemies = Vector.fromList newFallingEnemies val fallingEnemies = Vector.fromList fallingEnemies
in in
{ player = player { player = player
, walls = walls , walls = walls

View File

@@ -35,6 +35,7 @@ fcore/physics.sml
fcore/trace-jump.sml fcore/trace-jump.sml
fcore/enemy/enemy-behaviour.sml fcore/enemy/enemy-behaviour.sml
fcore/enemy/enemy.sml fcore/enemy/enemy.sml
fcore/enemy/falling-enemies.sml
fcore/player.sml fcore/player.sml
fcore/projectile.sml fcore/projectile.sml