AS3 removeChild和collisions:问题

时间:2016-07-22 20:58:58

标签: actionscript-3 flash removechild

我在Flash和AS3的小型射击游戏中工作。我仍然开始使用类文档,但我理解感谢教程。 所以这里是如何工作的: 当Enemy MovieClip击中用户射击的子弹时,我使用了HitTestObject:

//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);
    }
}

我还发出一个命令来检测Enemy MC和玩家之间的碰撞(我给了&#34; craft&#34;实例名称):

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(玩家),它也会被移除。但是我遇到了一个问题:当Enemy MC被击中时(4次被Bullet影片剪辑&#34;镜头&#34;被用户删除它)相撞 由玩家它不会被移除,因为它应该是...... 它仍然显示在屏幕上,并且是静态的:它既不会被子弹MC击中,也不会被玩家MC击中......

我认为这是因为parent.removeChild(this)从敌人MC的gotoAndPlay(4)执行,导致该问题:执行两次(因为Enemy MC是被子弹MC和玩家摧毁)...... 任何人都有想法解决removeChild的双重执行? 如果您想获得更多信息,可以下载来源: https://www.dropbox.com/s/wvl116wjqpu69d0/shoot_aircraft%20game.zip?dl=0

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

将你的敌人放入一个容器(可能只是一个Sprite对象)和动画调用的第四帧

parent.parent.removeChild(this.parent);

你可能必须更改一些敌人的移动代码行,但你可以弄明白。

基本上,我们的想法是将动画隐藏在非动画精灵中。在代码中间更改帧会使事情变得复杂,除非它的嵌套深度比被调用的对象更深。我希望这是有道理的。