#javascript #arrays #for-loop
#javascript #массивы #цикл for
Вопрос:
Я создаю игру, и у меня есть 2 массива, один для переменных пули, а другой для переменных противника. Они оба имеют отдельные циклы for, которые заставляют объекты функционировать, перемещаться, следовать, нацеливаться и т. Д. На данный момент меня беспокоят только значения x и y, которые хранятся в первых 2 значениях массива (так что можно быть врагами [0] [0] — значение x).
Могу ли я в любом случае объединить 2, чтобы они взаимодействовали?
for(var i = 0; i<enemies.length;i ){
enemies[i][0] =blah blah blah;
enemies[i][1] =blah blah blah;
}
for(var i = 0; i<bullets.length;i ){
bullets[i][0] =blah blah blah;
bullets[i][1] =blah blah blah;
}
Основываясь на комментариях, вот моя игра
Комментарии:
1. Не могли бы вы объяснить немного подробнее, что вы подразумеваете под созданием 2, чтобы они взаимодействовали.? Я бы также сказал, что для удобства чтения и отладки я бы использовал объектные литералы. например. маркеры [i] = {x: 10, y: 20) .. и т.д.
2. @Keith — Ну, пока они не могут сталкиваться, но это то, что мне нужно, чтобы они делали. Итак, если каким-то образом я смогу поместить оба массива в цикл for, чтобы они могли взаимодействовать, возможно, с хитбоксом и заставить бота исчезнуть.
3. Хорошо, вам нужно изучить обнаружение попадания. К сожалению, это немалый подвиг, поскольку существует множество способов сделать это. Я думаю, нам действительно нужно узнать больше о вашей игре здесь, чтобы иметь возможность помочь.
4. Можно ли здесь размещать GIF-файлы imgur? Извините, я новичок в stack overflow
5. @Keith — также я знаю, как сделать обнаружение хитбокса, только не с массивами значений
Ответ №1:
for(var i = 0; i < Math.max(enemies.length, bullets.length);i ){
if(i < enemies.length){
enemies[i][0] =blah blah blah;
enemies[i][1] =blah blah blah;
}
if(i < bullets.length){
bullets[i][0] =blah blah blah;
bullets[i][1] =blah blah blah;
}
}
на основе комментария другим способом:
for(var i = 0; i < bullets.length; i ){
//for each bullet
bullets[i][0] =blah blah blah;
bullets[i][1] =blah blah blah;
for(var j = 0; j < enemies.length;j ){
// each enemy
enemies[j][0] =blah blah blah;
enemies[j][1] =blah blah blah;
if(enemies[j].BBox.checkCollision(bullets[i])){
// they collide
}
}
}
если у вас есть только координаты x и y, трудно проверить столкновение, вам нужна ограничивающая рамка, возможно, даже для маркера, и я предлагаю вам использовать ООП
если у вас есть хотя бы смещение, проверка столкновения может быть выполнена следующим образом:
var bbox = {
'x': 0,
'y': 0,
'width': 100,
'height': 200
};
bbox.checkCollision = function(bullet){
return (bullet[0] > bbox.x amp;amp; bullet[0] < bbox.x bbox.width
amp;amp; bullet[1] > bbox.y amp;amp; bullet[1] < bbox.y bbox.height);
}
for(var i = 0; i < bullets.length; i ){
for(var j = 0; j < enemies.length;j ){
bbox.x = enemies[j][0];
bbox.y = enemies[j][1];
if(bbox.checkCollision(bullets[i])){
// bullets[i] collide with enemies[j]
}
}
}
Комментарии:
1. Видно, что это игра, и производительность обычно имеет значение. Возможно, стоит отметить, что это будет медленнее..
2. что с частью BBox? я просто погуглил это, и это о коробке коллисона, я думаю, что могу сделать свой собственный, но спасибо 🙂
3. bbox = ограничивающий прямоугольник
4. Да, я это делаю, но ваш способ кажется мне интригующим, я попробую (также вот видео imgur.com/B2vQGOQ )