update state of falling enemies per loop
This commit is contained in:
@@ -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
|
||||||
|
|||||||
61
fcore/enemy/falling-enemies.sml
Normal file
61
fcore/enemy/falling-enemies.sml
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
1
oms.mlb
1
oms.mlb
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user