progress on player-enemy collisions when player is attacking enemy
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user