2016-07-22 2 views
-1

Я работаю в маленькой стрелялке с 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

Благодарим за помощь.

+1

Не прочитал все это, но это пахнет плохим случаем кодирования при переключении кадров на основной временной шкале. Лучше всего избегать этой практики. На мой взгляд, основная временная шкала - для аниматоров, а не для программистов. –

+0

Здравствуйте, весь код, который я написал там, находится в документе ActionScript Class. Только 'parent.removeChild (this)' находится на временной шкале ** MovieClip ... ** –

+0

вы можете попробовать добавить условную проверку, как если бы (враг) {удалить врага}, чтобы она не пыталась удалить ее, если другое столкновение уже было. –

ответ

0

Поместите врага внутри контейнера (может быть только объект Sprite) и на 4-м кадре вызова анимации

parent.parent.removeChild(this.parent);

Вам придется изменить некоторые из ваших линий движения противника кода, но вы можете понять это.

В принципе идея состоит в том, чтобы скрыть анимацию внутри не анимационного Sprite. Изменение среднего кода кадра приводит к тому, что он закручивает объекты, если он не вложен глубже, чем объект, который вызывается. Я надеюсь, что в этом есть смысл.

+0

Не знаю, сделал ли я именно то, что вы сказали, но я создал пустой контейнер Movieclip и поместил в него врага Movieclip. Я написал ваш код внутри (в противнике Movieclip не в контейнере), а в четвертом кадре, когда он заканчивает анимацию, я помещаю вашу строку кода. Я назвал врага Movieclip внутри контейнера с именем экземпляра «e». В документе Class для доступа к Movieclip внутри контейнера я написал следующее: '[" e "]. GotoAndPlay (4);' И это не работает: Movieclip теперь зависает, когда он уничтожается игроком, не будучи уничтоженный столкновением ... –

+0

Есть только один враг? У него есть имя экземпляра под названием «e»? –

+0

Когда он находится внутри контейнера, да. –