as3 Враги в массиве проверяют друг друга?

Я медленно продвигаюсь в своей тестовой игре, и я дошел до того, что могу добавлять врагов на сцену через массив, они следуют за игроком и без проблем поворачиваются к игроку. Моя следующая задача — дать каждому противнику обнаружение столкновений друг с другом, иначе все они в конечном итоге просто полностью перекрывают друг друга, а это не очень реалистично.

Вот мой код пока только в отношении врагов:

public function initEnemy():void
        {
            enemyArray = new Array();

            for (var i = 0; i < 2; i++)
            {
                var enemy:Enemy = new Enemy((Math.random() *500 + 20), (Math.random() * 200 + 50));
                stage.addChild(enemy);
                enemyArray.push(enemy);
            }


        }
        public function enemyBehavior():void
        {
            var enemyRotation:int;

            for (var i:int = 0; i < enemyArray.length; i++)
            {
                var enemy = enemyArray[i];

                var dx:int = enemy.x - player.x;
                var dy:int = enemy.y - player.y;

                var dr:int = dx * dx + dy * dy;
                var dr2:int = Math.sqrt(dr);

                enemy.x -= enemySpeed * dx / dr2;
                enemy.y -= enemySpeed * dy / dr2;

                enemyRotation = -(Math.atan2(enemy.x - player.x, enemy.y - player.y) * 180 / Math.PI);
                trace(enemyRotation);

                enemy.rotation = enemyRotation;

                if (enemy.hitTestObject(enemyArray[i+1]))
                {
                    enemy.x -= -enemySpeed;
                    enemy.y -= -enemySpeed;
                }

Так вот где я застрял. В части вражеского.hitTestObject изначально у меня был просто вражеский хиттестирующий врага, но это заставило врага самому тестировать попадание и полностью испортило движение и вращение. Поэтому я попробовал вместо этого то, что у нас есть выше, ударил по тесту каждого экземпляра врага с экземпляром врага, следующим в следующем месте в массиве, и это работает с большинством врагов, но не со всеми, и выдает ошибку, потому что последний экземпляр в массиве будет пытаться выполнить проверку экземпляра, который не существует, и это приведет к огромному снижению производительности.

Может ли кто-нибудь дать мне какое-то направление, как лучше проверить эти объекты из массива, который более удобен для производительности?


person Hellbound Heart    schedule 30.06.2014    source источник
comment
возможный дубликат тестирования на столкновение с несколькими объектами на сцене   -  person CyanAngel    schedule 01.07.2014


Ответы (1)


Чтобы избавиться от ошибки, я должен быть меньше, чем (enemyArray.length - 1), но логика все равно будет ошибочной, потому что она не проверяет столкновения между всеми врагами. Чтобы проверить столкновения между всеми вашими врагами, вы должны сделать что-то вроде:

for (var i:int = 0; i < enemyArray.length - 1; i++) {
   var enemy1 = enemyArray[i];

   for(var j:int = i+1; j< enemyArray.length; j++) {
      var enemy2 = enemyArray[j];
      if(enemy1.hitTestObject(enemy2)){
            //do something on collision
      }
   }
}

Если вы хотите что-то производительное, особенно если у вас много врагов, вы должны сравнить координаты врагов и посмотреть, не пересекаются ли они. Подробнее о столкновении нескольких объектов можно прочитать здесь: http://www.emanueleferonato.com/2008/06/07/managing-multiple-balls-collisions-with-flash-as3-version/

person Cristina Georgescu    schedule 01.07.2014
comment
О, чувак, это отличное чтение, и именно то, что я искал, большое спасибо, Кристина! - person Hellbound Heart; 01.07.2014