Удалить пулю при попадании в стену

Я делаю платформу для AS3, в которой игрок может стрелять пулями.

Когда пуля касается врага, враг умирает, а пуля удаляется.

Мне это удалось, но теперь я хотел бы удалить пулю, если она попала в стену, и я не могу понять, как это сделать.

Пока что вот мой код для удаления пули при касании врага:

public function checkCollisions() {

            // enemies
            for(var i:int=enemies.length-1;i>=0;i--) {
                if (hero.mc.hitTestObject(enemies[i].mc)) {

                    // is the hero jumping down onto the enemy?
                    if (hero.inAir && (hero.dy > 0)) {
                        enemyDie(i);
                    } else {
                        heroDie();
                    }
                }

            for (var j:int = 0; j < bulletList.length; j++) // for each bullet in the bulletList
                {
                    if (enemies[i].mc.hitTestObject(bulletList[j]) )
                    {
                        trace("Bullet and Enemy are colliding");
                        enemyDie(i)
                        bulletList[j].removeSelf();
                    }

                }
            }

Я определил свою стену и пол следующим образом:

public function examineLevel() {
            fixedObjects = new Array();
            otherObjects = new Array();
            for(var i:int=0;i<this.gamelevel.numChildren;i++) {
                var mc = this.gamelevel.getChildAt(i);

                // add floors and walls to fixedObjects
                if ((mc is Floor) || (mc is Wall)) {
                    var floorObject:Object = new Object();
                    floorObject.mc = mc;
                    floorObject.leftside = mc.x;
                    floorObject.rightside = mc.x+mc.width;
                    floorObject.topside = mc.y;
                    floorObject.bottomside = mc.y+mc.height;
                    fixedObjects.push(floorObject);
}
}

Я пытался поместить это в свою функцию checkCollisions, но она не работает:

for(var k:int=0;k<fixedObjects.length;k++)
                    {
                        if (fixedObjects[k].hitTestObject(bulletList[j]) ){
                            trace("hit wall");
                        }

Вы знаете, что мне нужно положить, чтобы удалить пулю, когда она касается стены (или пола)?

Спасибо


person user2421975    schedule 21.07.2014    source источник


Ответы (1)


Массив fixedObjects содержит ссылки на экземпляры Object. Однако hitTestObject(obj) является общедоступной функцией класса DisplayObject, и параметр obj должен быть экземпляром DisplayObject.

Если предоставленный вами фрагмент кода точно такой же, как тот, который вы использовали в своей игре, должны быть сгенерированы сообщения об ошибках во время выполнения.

Не могли бы вы проверить, является ли это причиной невозможности обнаружить столкновение?

person S.C.    schedule 21.07.2014
comment
Действительно, есть сообщение об ошибке во время выполнения. Это ошибка № 1006: hitTestObject не является функцией. в PlatformGame/checkCollisions()[E:\Applis\Brousse En Folie Plateforme\PlatformGame.as:366] в PlatformGame/gameLoop()[E:\Applis\Brousse En Folie Plateforme\PlatformGame.as:198] строка 366, если (fixedObjects[k].hitTestObject(bulletList[j])){ - person user2421975; 21.07.2014
comment
Вы можете попробовать добавить floorObject.mc вместо floorObject в fixedObjects. Это должно работать до тех пор, пока fixedObjects не используется в других разделах. - person S.C.; 21.07.2014
comment
Хм...? где ? причина, если я изменю fixedObjects.push(floorObject); по fixedObjects.push(floorObject.mc); не работает (мой персонаж падает со сцены) - person user2421975; 21.07.2014
comment
Хорошо, тогда вы используете floorObject где-то еще в своем коде. Не изменяя массив fixedObjects, вы можете заменить if (fixedObjects[k].hitTestObject(bulletList[j]) ){ на if (fixedObjects[k].mc.hitTestObject(bulletList[j]) ){ и посмотреть, работает ли это. - person S.C.; 21.07.2014
comment
Идеально ! Это работает ! Спасибо !!! (но знаете ли вы, почему эта ошибка возникает во время выполнения, если я добавляю bulletList[j].removeSelf();, где trace("hit wall")?: error #2007 parameter hitTestObject must be non-null ) - person user2421975; 21.07.2014
comment
Я думаю, это потому, что код хочет сделать две вещи. if (enemies[i].mc.hitTestObject(bulletList[j]) ) И if (fixedObjects[k].mc.hitTestObject(bulletList[j]) ){ Итак, для одного из них он нашел hitTestObject как null - person user2421975; 21.07.2014
comment
fixedObjects[k].hitTestObject(bulletList[j]) генерирует ошибку, так как fixedObjects[k] является Object, но в классе Object нет функции с именем hitTestObject(something). - person S.C.; 21.07.2014
comment
Так почему нет ошибки для if (enemies[i].mc.hitTestObject(bulletList[j]) ) ? Что мне нужно сделать, чтобы fixedObjects[k].hitTestObject(bulletList[j]) заработало? - person user2421975; 21.07.2014
comment
В строке enemies[i].mc.hitTestObject(bulletList[j]), просто взглянув на имена переменных, которые вы использовали, кажется, что enemies[i] является экземпляром одного из ваших самоопределяемых классов, и есть переменная mc, содержащая ссылку на экземпляр MovieClip вашего вражеского объекта. Поскольку MovieClip является подклассом DisplayObject, а hitTestObject(obj) является общедоступной функцией, определенной в классе DisplayObject, строка enemies[i].mc.hitTestObject(bulletList[j]) действительна. - person S.C.; 21.07.2014
comment
Если вы хотите, чтобы fixedObjects[k].hitTestObject(bulletList[j]) работало должным образом, fixedObjects должен быть массивом из DisplayObject или MovieClip экземпляров. В настоящее время в вашем коде fixedObjects представляет собой массив из Object экземпляров. Вам придется изменить тип данных fixedObjects, но это приведет к другим проблемам, так как некоторые другие фрагменты кода полагаются на этот массив. Если приведенное выше решение работает, я предлагаю больше ничего не менять. Код должен быть достаточно удобочитаемым. - person S.C.; 21.07.2014
comment
Может быть, я мог бы добавить клип на сцену с экземпляром (например, test_mc) и поставить что-то вроде test_mc.hitTestObject(bulletList[j]) - person user2421975; 22.07.2014
comment
Приятно поэкспериментировать с различными возможными решениями, хотя в данном случае это может показаться немного излишним. - person S.C.; 22.07.2014