0

こんにちは、問題があります。原因はわかっていると思いますが、解決方法がわかりません。私は誰でもこの問題を解決するのを手伝うことができます。それは素晴らしいことです...エラーは

TypeError: エラー #1009: null オブジェクト参照のプロパティまたはメソッドにアクセスできません。Bullet/removeSelf()[C:\Users\Alan\Desktop\game copy\Bullet.as:56] で Bullet/loop()[C:\Users\Alan\Desktop\game copy\Bullet.as:44]

HERE は、BULLET ps を削除する 1 つの主なアクションのコードです。キャップでごめんなさい。

    stage.addEventListener(Event.ENTER_FRAME, testCollisions);

//Check for collisions between an enemies array and a Lasers array
function testCollisions(e:Event):void
{

    var tempEnemy:MovieClip;
    var tempLaser:MovieClip;

    for (var i:int=enemies.length-1; i >= 0; i--)
    {
        tempEnemy = enemies[i];
        for (var j:int=bullets.length-1; j>=0; j--)
        {
            tempLaser = bullets[j];
            if (tempLaser.hitTestObject(tempEnemy))
            {

                removeChild(tempEnemy);
                removeLaser(j);

            } 
        }
    }
}




function removeLaser(idx:int)
{
    parent.removeChild(bullets[idx]);
    bullets.splice(idx,1);
}

これは、それを削除する弾丸クラスのコードです

    public class Bullet extends MovieClip {

        private var speed:int = 30;
        private var initialX:int;
        public var eligableForRemove:Boolean = false;



        public function Bullet(playerX:int, playerY:int, playerDirection:String) {

            // constructor code
            if(playerDirection == "left") {
                speed = -30; //speed is faster if player is running
                x = playerX - 25;
            } else if(playerDirection == "right") {
                speed = 30;
                x = playerX + 25
            }
            y = playerY - 75;

            initialX = x; //use this to remember the initial spawn point

            addEventListener(Event.ENTER_FRAME, loop);
        }

        public function loop(e:Event):void
        {
            //looping code goes here
            x += speed;

            if(speed > 0) { //if player is facing right
                if(x > initialX + 640) { //and the bullet is more than 640px to the right of where it was spawned
                    removeSelf(); //remove it
                    eligableForRemove = true;
                }
            } else if (speed < 0) { //else if player is facing left
                if(x < initialX - 640) {  //and bullet is more than 640px to the left of where it was spawned
                    removeSelf(); //remove it
                    eligableForRemove = true;
                } else {
                    eligableForRemove = false;
                    }
            }
        }

        public function removeSelf():void
        {
            if(eligableForRemove == true){trace("remove self");
            removeEventListener(Event.ENTER_FRAME, loop); //stop the loop
            this.parent.removeChild(this); //tell this object's "parent object" to remove this object
            //in our case, the parent is the background because in the main code we said:
            //back.addChild(bullet);
            }

        }

    }

}

削除するものが何もないときに空の関数 removeSelf を呼び出していることが原因だと思います。eligableForRemove変数を追加しましたが、正しく配置していない可能性がありますので、誰かがこの問題を解決するのを手伝ってくれれば幸いです...また、メインのアクションから箇条書きを削除しようとすると、呼び出し元エラーの子。助けてください。

4

1 に答える 1

0

これは、子を2回削除しようとしたことが原因である可能性があり、呼び出しeligableForRemove た後removeSelf()に設定しているためremoveSelf()、更新された値は表示されません。

ただし、問題は、弾丸を削除しているのに、弾丸が死んだことを伝えてremoveLaser()ないため、ループを実行し続け、最終的には範囲外になり、再び自分自身を削除しようとすることだと思います。

を取り除くことができ、次のようeligableForRemoveに変更removeLaser()するだけです。

function removeLaser(idx:int)
{
    (bullets[idx] as Bullet).removeSelf();
    bullets.splice(idx,1);
}

(または、がの場合bulletsは、ランタイムがすでにそれを認識しているので、実行Vector.<Bullet>できます。)bullets[idx].removeSelf()Bullet

于 2013-03-23T17:59:28.987 に答える