62 lines
1.7 KiB
Standard ML
62 lines
1.7 KiB
Standard ML
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
|