Проблема в этой строке:
collision(enemy[i].x,enemy[i].y,player[j].x,player[j].y,32,32,32,32,player.splice(j,1),enemy.splice(i,1));
В функцию передаётся не действие, которое надо выполнить в случае — а его результат. Вот эти
player.splice(j,1)
enemy.splice(i,1)
выполняются сразу, при первом же обращении — и не останется ни игроков ни врагов. Ядерная зима.
Чтобы не выполнять их сразу же, оберните эти действия в функцию и передавайте функцию в
collision()
, чтобы там её вызвали только после проверки условий.
Ещё можно не передавать сотню параметров, а договориться, что у объектов игроков и врагов всегда будут свойства
x, y, w, h
. Так можно передавать сами объекты целиком:
function collision(A, B, onCollision) {
if (
A.x + A.w >= B.x
&& A.x <= B.x + B.w
&& A.y + A.h >= B.y
&& A.y <= B.y + B.h
) {
onCollision(); // <-- только тут выполнятся действия
}
}
// ...
player.push({x: 0, y: 0, w: 32, h: 32});
enemy.push({x: 144, y: 104, w: 32, h: 32});
// ...
collision(
enemy[i],
player[j],
function() {
player.splice(j,1);
enemy.splice(i,1);
}
);
Рабочий
jsFiddle