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,23 +1,40 @@
structure BinSearch = structure BinSearch =
struct struct
local fun helpExists (findNum, vec, low, high) =
fun helpFind (findNum, vec, low, high) = if high >= low then
if high >= low then let
let val mid = low + ((high - low) div 2)
val mid = low + ((high - low) div 2) val curNum = Vector.sub (vec, mid)
val curNum = Vector.sub (vec, mid) in
in if curNum = findNum then
if curNum = findNum then true
mid else if curNum < findNum then
else if curNum < findNum then helpExists (findNum, vec, mid + 1, high)
helpFind (findNum, vec, mid + 1, high) else
else helpExists (findNum, vec, low, mid - 1)
helpFind (findNum, vec, low, mid - 1) end
end else
else false
~1
in fun exists (findNum, vec) =
fun find (findNum, vec) = helpExists (findNum, vec, 0, Vector.length vec - 1)
helpFind (findNum, vec, 0, Vector.length vec - 1)
end fun helpFind (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
mid
else if curNum < findNum then
helpFind (findNum, vec, mid + 1, high)
else
helpFind (findNum, vec, low, mid - 1)
end
else
~1
fun find (findNum, vec) =
helpFind (findNum, vec, 0, Vector.length vec - 1)
end end

View File

@@ -47,14 +47,21 @@ struct
end end
| [] => acc | [] => acc
fun checkEnemiesWhileAttacking (player, enemies, lst, acc) = (* removes enemies from `enemies` vector when that enemy is in collisions *)
let fun filterEnemyCollisions (pos, collisions, enemies: enemy vector, acc) =
open QuadTree if pos < 0 then
in Vector.fromList acc
case lst of else
enemyID :: tl => (* placeholder *) acc let
| [] => acc val enemy = Vector.sub (enemies, pos)
end in
if BinSearch.exists (#id enemy, collisions) then
(* filter out *)
filterEnemyCollisions (pos - 1, collisions, enemies, acc)
else
(* don't filter out *)
filterEnemyCollisions (pos - 1, collisions, enemies, enemy :: acc)
end
fun checkPlayerEnemyCollisions (player, game) = fun checkPlayerEnemyCollisions (player, game) =
let let
@@ -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