progress on player-enemy collisions when player is attacking enemy

This commit is contained in:
2024-12-27 18:12:42 +00:00
parent 01bc91e201
commit ada63d54ce
2 changed files with 59 additions and 28 deletions

View File

@@ -1,6 +1,24 @@
structure BinSearch = structure BinSearch =
struct struct
local fun helpExists (findNum, vec, low, high) =
if high >= low then
let
val mid = low + ((high - low) div 2)
val curNum = Vector.sub (vec, mid)
in
if curNum = findNum then
true
else if curNum < findNum then
helpExists (findNum, vec, mid + 1, high)
else
helpExists (findNum, vec, low, mid - 1)
end
else
false
fun exists (findNum, vec) =
helpExists (findNum, vec, 0, Vector.length vec - 1)
fun helpFind (findNum, vec, low, high) = fun helpFind (findNum, vec, low, high) =
if high >= low then if high >= low then
let let
@@ -16,8 +34,7 @@ struct
end end
else else
~1 ~1
in
fun find (findNum, vec) = fun find (findNum, vec) =
helpFind (findNum, vec, 0, Vector.length vec - 1) helpFind (findNum, vec, 0, Vector.length vec - 1)
end
end end

View File

@@ -47,13 +47,20 @@ struct
end end
| [] => acc | [] => acc
fun checkEnemiesWhileAttacking (player, enemies, lst, acc) = (* removes enemies from `enemies` vector when that enemy is in collisions *)
fun filterEnemyCollisions (pos, collisions, enemies: enemy vector, acc) =
if pos < 0 then
Vector.fromList acc
else
let let
open QuadTree val enemy = Vector.sub (enemies, pos)
in in
case lst of if BinSearch.exists (#id enemy, collisions) then
enemyID :: tl => (* placeholder *) acc (* filter out *)
| [] => acc filterEnemyCollisions (pos - 1, collisions, enemies, acc)
else
(* don't filter out *)
filterEnemyCollisions (pos - 1, collisions, enemies, enemy :: acc)
end end
fun checkPlayerEnemyCollisions (player, game) = fun checkPlayerEnemyCollisions (player, game) =
@@ -108,6 +115,10 @@ struct
val patches = val patches =
checkEnemiesWhileAttacking (player, enemies, enemyCollisions, []) checkEnemiesWhileAttacking (player, enemies, enemyCollisions, [])
val player = Player.withPatches (player, patches) val player = Player.withPatches (player, patches)
val enemyCollisions = Vector.fromList enemyCollisions
val enemies = filterEnemyCollisions
(Vector.length enemies - 1, enemyCollisions, enemies, [])
in in
(player, enemies) (player, enemies)
end end
@@ -122,6 +133,9 @@ struct
(* check player-enemy collisions and react *) (* check player-enemy collisions and react *)
val (player, enemies) = checkPlayerEnemyCollisions (player, game) val (player, enemies) = checkPlayerEnemyCollisions (player, game)
(* create enemy quad tree from list of new enemies *)
val enemyTree = Enemy.generateTree enemies
in in
{ player = player { player = player
, walls = walls , walls = walls