1

我正在尝试使用 hitTestObject 函数制作一个带有子弹射击和船只相互碰撞的太空入侵者类型游戏,但我无法获得 removeChild(); 功能可以在没有上述错误的情况下工作。这是我应该怎么做的代码。

import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.MovieClip;

var count:int = 1;

//adding the components
var NewBullet:MovieClip = new Bullet;

    var Ship_M:MovieClip = new Ship; 
    Ship_M.x = 270;
    Ship_M.y = 470;
    addChild(Ship_M);


    var Ship_E:MovieClip = new E_Ship;
    Ship_E.x = 270;
    Ship_E.y = 5;
    addChild(Ship_E);


stage.addEventListener(Event.ENTER_FRAME , Rec);
function Rec(e:Event):void{
  if (NewBullet.hitTestObject(Ship_E))
  {
    removeChild(Ship_E);
    removeChild(NewBullet);

  }

   if (Ship_E.hitTestObject(Ship_M))
   {
      removeChild(Ship_E);
      removeChild(Ship_M);
    }



    }

function Moves(e:Event):void{

            NewBullet.y -= 30;

    if (NewBullet.y < 0 )
        {

         removeChild(NewBullet);

          count++;
    removeEventListener(Event.ENTER_FRAME, Moves);

        }

          trace (count);
    }



//For Moving the Spaceship          
stage.addEventListener(KeyboardEvent.KEY_DOWN, Move);

function Move (event:KeyboardEvent):void{

 switch(event.keyCode)

    {
        case 37: 
            if (Ship_M.hitTestObject(Stop_L1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x -=  10;
            }
        break;

        case 38:
            if (Ship_M.hitTestObject(Stop_U1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y -=  10;
            }

        break;

        case 39:
            if (Ship_M.hitTestObject(Stop_R1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x +=  10;
            }

        break;

        case 40:
            if (Ship_M.hitTestObject(Stop_D1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y +=  10;
            }

        break;


        case 32:
        addChild(NewBullet);
        NewBullet.x = Ship_M.x;
        NewBullet.y = Ship_M.y;

        addEventListener(Event.ENTER_FRAME, Moves);
        break;

        default:

    }

}
4

3 回答 3

1

在您的特定情况下您可能不需要这个,但我有一个辅助函数来删除一个孩子并使其符合 GC 的条件,如下所示:

private function remove(child:DisplayObject):void
{
    if(child && child.parent)
    {
        child.parent.removeChild(child);
        child = null;
    }
}
于 2012-09-20T12:47:00.200 回答
1

替换你的

removeChild(SomeSprite); 

if (SomeSprite.parent)
    SomeSprite.parent.removeChild(SomeSprite); 

对象父级只能调用 removeChild。

于 2012-09-20T12:08:34.577 回答
0

很可能您会执行两次 removeChild(NewBullet),第一次是到达 Ship_E 时,第二次是离开边界时。一个简单的解决方案是每当您的 NewBullet 从舞台上移除时,为其设置一个标志,说“启用”,这意味着项目符号可以触发事件,并在您必须检查项目符号时在整个代码中检查它。

注意,你只有一颗子弹,这正常吗?

于 2012-09-20T12:58:50.767 回答