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

あなたのものを交換してください

removeChild(SomeSprite); 

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

オブジェクトの親は、removeChild のみを呼び出すことができます。

于 2012-09-20T12:08:34.577 に答える
1

特定の状況ではこれは必要ないかもしれませんが、子を削除して GC の対象にするヘルパー関数があります。次のようになります。

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

ほとんどの場合、removeChild(NewBullet)を2回実行します。1回目はShip_Eにヒットしたとき、2回目は境界を離れたときです。簡単な解決策は、NewBulletがステージから削除されるたびにフラグを設定し、「有効」と言うことです。これは、弾丸がイベントをトリガーできることを意味し、弾丸をチェックする必要があるときはいつでもコード全体でチェックします。

弾丸は1つしかないことに注意してください、それは正常ですか?

于 2012-09-20T12:58:50.767 に答える