hitTest с объектами из двух массивов - PullRequest
0 голосов
/ 02 февраля 2012

По сути, я собираюсь сделать так, чтобы маркеры hitTest находились внутри массива (порождение через addChild -> помещается в массив) с другим массивом, содержащим корабли (порождение через addChild -> также помещалось в массив).

На данный момент у меня есть:

function moveEnemyLarge():void{
    var target2:EnemyLarge;

    for(var i2:int=0;i2<enemyShipArray.length;i2++){
        // Move each ship in the array down.
        target2 = EnemyLarge(enemyShipArray[i2]);
        target2.y += 0.5;

        // Hit Test
        if(target2.hitTestObject(PLACEHOLDER)){
            trace("SHIP HIT BULLET");
            removeChild(target2);
            enemyShipArray.splice(i2,1);
            i2--;
        }

        // Remove when off-stage.
        if(target2.y > 700){
            removeChild(target2);
            enemyShipArray.splice(i2,1);
            i2--;
        }
    }
}

.. и почти идентичная функция для пуль (с использованием переменных: i, target). Какой самый простой способ для меня - проверить объекты в моем массиве маркеров объектами в моем массиве кораблей. Помещение «цели» в слот PLACEHOLDER не работает, и из того, что я видел, некоторые люди будут толкать один для () внутри другого.

Дайте мне знать, если вам понадобится какой-либо дополнительный код или пояснения с моей стороны - я только изучаю веревки AS3 и еще не изучил кучу методов!

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Очевидным решением будет 2 цикла.

for (var i:int = 0; i < ships.length; i++) {
  var target:EnemyLarge = ships[i];
  target.y += .5;
  for (var j:int = 0; j < bullets.length; j++) {
    var bullet:Bullet = bullets[j];
    if (target.hitTestObject(bullet)) {
      ships.splice(i,1); i--;
      removeChild(target);
    }
  }
}

Этот вариант подходит для простых обучающих проектов, но у него есть несколько недостатков:

  1. Никогда (я НИКОГДА не говорил) изменятьколлекция, которую вы повторяете.У вас будут часы отладки позже, чтобы понять, что происходит.
  2. Если пули или корабли очень быстрые, пуля может перемещаться по кораблю в одном кадре.В этом случае вам может потребоваться проверить не только пулю, но и линию от последней позиции пули до текущей позиции.
  3. Если у вас много пуль и кораблей, у вас будут проблемы.В этом случае вам понадобится некоторая структура данных, чтобы запрашивать пули возле кораблей быстрее, чем линейный поиск.
0 голосов
/ 03 февраля 2012

В вашей настройке вы должны прибегнуть к петле внутри петли, чтобы проверить каждую пулю против каждого корабля (или наоборот). Внутренний цикл будет выглядеть так:

for(var bullet:Bullet in bullets) {
 if(target2.hitTestObject(bullet)){
  trace("SHIP HIT BULLET");
  bullet.parent.removeChild(bullet); // remove the bullet
  removeChild(target2);
  enemyShipArray.splice(i2,1);
  i2--;
 }
}

Есть несколько способов обойти это альтернативно.

  • сеточная система, в которой каждая ячейка проверяет только коллизии для своих дочерних элементов
  • разбиение игрового пространства на пространства Y, если на этой равнине произошло столкновение, проверьте наличие столкновения по оси X
  • поиск пикселей, при котором пуля считывает некоторую информацию с цветовой кодировкой, на каком корабле она попала
  • и некоторые другие, о которых я не могу думать сейчас
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...