Я пытаюсь настроить обнаружение столкновений так, чтобы оно игнорировало дочернего объекта цели. (Actionscript 3) - PullRequest
1 голос
/ 23 февраля 2010

Так что в моей игре каждый мувиклип «противник» создает текстовое поле, которое представляет имя врага. Проблема в том, что я хочу, чтобы мой механизм обнаружения столкновений обнаруживал столкновение с самим противником, а не с текстовым полем.

Это код, который у меня есть в настоящее время в моем классе столкновений для обнаружения столкновения с врагом:

for(var i = 0;i < _enemies.length; i++)
            {
                if(CollisionEngine.isColliding(_laser, _enemies[i]._enemyNameTextField, _animation))
                {
                }
                else if(CollisionEngine.isColliding(_laser, _enemies[i], _animation))
                {
                    _enemies[i].kill();
                    _animation._killedEnemy = true;
                }
            }

Первое условие if проверяет наличие столкновения с текстовым полем противника. Иначе, если проверяет на столкновение с врагом.

Проблема с этой текущей реализацией состоит в том, что если «лазер» сначала попадает в текстовое поле, проходит через него и поражает противника, он не определяется как столкновение.

Есть идеи, как мне обойти это?

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Изменить порядок чеков:

if(CollisionEngine.isColliding(_laser, _enemies[i], _animation))
{
    if(!CollisionEngine.isColliding(_laser, _enemies[i]._enemyNameTextField, _animation)) 
    {
        _enemies[i].kill();
        _animation._killedEnemy = true;
    }
}

Обратите внимание, что приведенный выше код эквивалентен:

if(CollisionEngine.isColliding(_laser, _enemies[i], _animation) && !CollisionEngine.isColliding(_laser, _enemies[i]._enemyNameTextField, _animation)) 
{
    _enemies[i].kill();
    _animation._killedEnemy = true;
}

Кроме того, вы можете явно определить hitArea для всех своих врагов, чтобы столкновения с текстовым полем не считались столкновениями.

0 голосов
/ 23 февраля 2010

у вашего врага есть такой метод:

public function getCollision():Sprite{
    //Where this.body is the main animation for the clip/Hittest area
    return this.body
}

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

if(CollisionEngine.isColliding(_laser, _enemies[i].getCollision(), _animation))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...