Нужна помощь в объединении 2 позиционных массивов и циклов for

#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;
}
  

Основываясь на комментариях, вот моя игра

http://imgur.com/B2vQGOQ

Комментарии:

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 )