Я работаю в маленькой стрелялке с Flash и AS3. Я все еще начинаю использовать документы класса, но мне удалось понять благодаря учебникам. Так вот как это работает: Я использовал HitTestObject, когда враг MovieClip попадает пуля, выстрел пользователем:AS3 removeChild and collisions: issue
//checking if it is touching any bullets
//we will have to run a for loop because there will be multiple bullets
for(var i:int = 0;i<_root.bulletContainer.numChildren;i++){
//numChildren is just the amount of movieclips within
//the bulletContainer.
//we define a variable that will be the bullet that we are currently
//hit testing.
var bulletTarget:MovieClip = _root.bulletContainer.getChildAt(i);
//now we hit test
if(hitTestObject(bulletTarget)){
hit++;
if(hit==4)
{
gotoAndPlay(4); //the Enemy MC is removed after 4 hits(parent.removeChild(this))
removeEventListener(Event.ENTER_FRAME, eFrame);
//the Bullet MC is removed with its Listeners
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
}
if(hit<4)
{
gotoAndPlay(2);
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
}
if(hit > 4)
{
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
hit = 0;
}
}
}
Таким образом, после 4 ударов, он полностью удаляется с экрана. Функция eFrame удалить Enemy MC, если он идет со сцены:
private function eFrame (event:Event):void{
x+=speed;
if(this.x > stage.stageWidth + 50){
removeEventListener(Event.ENTER_FRAME, eFrame);
_root.removeChild(this);
}
}
Я также поставил команду, которая обнаруживает столкновения между врагом MC и плеер (который я дал «ремесло» имя экземпляра):
if(hitTestPoint(_root.craft.x -203.25, _root.craft.y - 44.9, collide))
{
_root.dmg.width+=8;//reduce the life bar
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -210.6, _root.craft.y - 32.9, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -210.6, _root.craft.y - 6, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -211.4, _root.craft.y + 20, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
...//There is a lot of other points with the same results...
Таким образом, вражеский MC также удаляется, если он попадает в корабль MC (Player). Но я столкнулся с проблемой: когда попал Enemy MC (4 раза выстрелом «Bullet movieclips» от пользователя, который его удаляет) , но также столкнулся с от игрока, он не удаляется, поскольку он должен быть ... это вместо того, чтобы по-прежнему отображается на экране, и статична: она не может попасть ни пулей MC, ни игроком MC ...
Я думаю, что это из-за parent.removeChild(this)
выполненный от gotoAndPlay(4)
Врага MC, который вызывает эту проблему: он выполнен a дважды (потому что враг MC находится , уничтоженный Bullet MC И игроком) ... У кого-нибудь есть идея решить это двойное выполнение removeChild
? Для получения дополнительной информации вы можете скачать источник: https://www.dropbox.com/s/wvl116wjqpu69d0/shoot_aircraft%20game.zip?dl=0
Благодарим за помощь.
Не прочитал все это, но это пахнет плохим случаем кодирования при переключении кадров на основной временной шкале. Лучше всего избегать этой практики. На мой взгляд, основная временная шкала - для аниматоров, а не для программистов. –
Здравствуйте, весь код, который я написал там, находится в документе ActionScript Class. Только 'parent.removeChild (this)' находится на временной шкале ** MovieClip ... ** –
вы можете попробовать добавить условную проверку, как если бы (враг) {удалить врага}, чтобы она не пыталась удалить ее, если другое столкновение уже было. –