@Afafks123132132165

Почему js выдает ошибку?

Вот сижу я в песочнице тестирую столкновения но тут я вижу баг:
Cannot read property 'x' of undefined at game на 51 строчке кода что делать?
<!DOCTYPE html>
<html>
<head>
	<title>Test</title>
</head>
<body>
<canvas id = "canvas" width = "320" height="480"></canvas>
<style>
</style>
<script type="text/javascript">
document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var enemy = [];
var bullet = [];
var px = 128;
var py = 448;
var t = 0;

enemy.push({x:Math.floor(Math.random()*(320-0)+0),y:0});
}
if(t%20 == 0){
bullet.push({x:Math.floor(Math.random()*(320-0)+0),y:py+16});
}
for(i in bullet){
ctx.fillRect(bullet[i].x,bullet[i].y,10,10);
for(j in enemy){
if(enemy[j].x + 12 >= bullet[i].x && enemy[j].x <= bullet[i].x+10){  //Ошибка
if(enemy[j].y + 12 >= bullet[i].y && enemy[j].y <= bullet[i].y+10){
enemy.splice(j,1);
bullet.splice(i,1);
}
}
}
bullet[i].y-=1;
}
for(i in enemy){
ctx.fillRect(enemy[i].x,enemy[i].y,12,12);
enemy[i].y+=2;
}
t+=1;
}
setInterval(game,20);
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 3
hzzzzl
@hzzzzl
(я фигню написал раньше про массив, удалил)

хз, вставил код тупо сюда, без ошибки



https://jsfiddle.net/3rfgcp8z/
Ответ написан
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
Тыкать человеку выше вам никто не давал права, тут все очевидно как вода в море, напрягите чуть-чуть свой инструмент в черепе и все станет понятно.
Вы перебираете объект :

for(el in bullet) {
  console.log(el); // Выводим объект
  console.log(el.x); // Выводим координату, ищите где у вас ошибка и фиксите.
}


Если возникает новое, поступаем аналогично, только перед тем как брызгаясь слюнями писать сюда вопрос, погуглите как использовать то или иное, чтобы не задавать банальных вопросов.
Ответ написан
Robur
@Robur
Знаю больше чем это необходимо
проблема у вас вот тут
enemy.splice(j,1);
bullet.splice(i,1);


вы меняете массив по которому идете и пока идете он становится меньше.

поменяйте for ... in на обычный for но идущий в обратном порядке for (let i=bullet.length-1;i>=0;i--)
для enemy делайте аналогично
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы