0

修正できないエラーが表示されます。何が起こっているのかはある程度わかっていると思いますが、それを修正できるほど十分かどうかはわかりません。エラーが発生し続けます

「TypeError: エラー #2007: パラメータ hitTestObject は非 null でなければなりません。

flash.display::DisplayObject/_hitTest() で

flash.display::DisplayObject/hitTestObject() で"

基本的に私は自分のゲームで攻撃を発射します。それは敵に当たり、彼はうまく殺されます。しかし、彼は死ぬときに数秒かかるアニメーションを持っています. 彼のアニメーション中に別の攻撃を発射すると、私の攻撃はすぐにこのエラーを発生させるようです (つまり、何かを攻撃する前に)。アニメーションが終了すると、すべてが再び正常になります。また、このアニメーションを挿入する前は、ゲームは 100% 正常に動作していました。

これが私のドキュメントクラスです

package com.classes 
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;

    public class DocumentClass extends MovieClip
    {

        // we need to keep track of our enemies.
        public static var enemyList1:Array = new Array();
        // moved stickobject1 to a class variable.
        private var stickobject1:Stickman2;

        public function DocumentClass() : void
        {
            //removed the var stickobject1:Stickman2 because we declared it above.
            var bg1:background1 = new background1();
            stage.addChild(bg1);

            stickobject1 = new Stickman2(stage);
            stage.addChild(stickobject1);

            stickobject1.x=50;
            stickobject1.y=300;

            //running a loop now.... so we can keep creating enemies randomly.
            addEventListener(Event.ENTER_FRAME, loop, false, 0, true);

        }

        //our loop function
        private function loop(e:Event) : void
        {
            //run if condition is met.
            if (Math.floor(Math.random() * 90) == 5)
            {
                //create our enemyObj1 
                var enemyObj1:Enemy1 = new Enemy1(stage, stickobject1);

                //listen for enemyObj1 being removed from stage
                enemyObj1.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemyObj1, false, 0, true);

                //add our enemyObj1 to the enemyList1
                enemyList1.push(enemyObj1);

                stage.addChild(enemyObj1);
            }   
        }

        private function removeEnemyObj1(e:Event)
        {
            enemyList1.splice(enemyList1.indexOf(e.currentTarget), 1);
        }


    }

}

そして、ここに私のattack1クラスがあります

package com.classes {

    import flash.display.MovieClip;
    import flash.display.Stage;
    import com.senocular.utils.KeyObject;
    import flash.ui.Keyboard;
    import flash.events.Event;


    public class attack1 extends MovieClip {


        private var stageRef:Stage;
        private var bulletSpeed:Number = 16;

        public function attack1 (stageRef:Stage, x:Number, y:Number) : void
        {
            this.stageRef = stageRef;
            this.x = x;
            this.y = y;

            addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
        }

        private function loop(e:Event) : void
        {
            //move bullet up
            x += bulletSpeed;

            if (x > stageRef.stageWidth) 
                removeSelf();

            for (var i:int = 0; i < DocumentClass.enemyList1.length; i++)
            {
                if (hitTestObject(DocumentClass.enemyList1[i].hit))
                {
                    trace("hitEnemy");
                    removeSelf();
                    DocumentClass.enemyList1[i].takeHit();
                }
            }
        }

        private function removeSelf() : void
        {
            removeEventListener(Event.ENTER_FRAME, loop);

            if (stageRef.contains(this))
                    stageRef.removeChild(this);
        }

    }

}

何が起こっているのかを理解するために他のクラスが必要だとは思わないでください。どうもありがとう =)

4

2 に答える 2

1

シーン (またはenemyList 配列) から削除された可能性のあるオブジェクトに対してヒット テストを実行する必要はありません。attack1.loop の for ループに追加された追加の条件により、エラーが解消されます。より良い修正は、削除するアイテムをつなぎ合わせて、ループ内でテストされないようにすることです。

ブレーク ラインは、弾丸が取り除かれた後、他の敵に命中しようとするのをやめさせます。「DocumentClass.enemyList1[i].takeHit();」という行の場合 敵リスト 1 からアイテムを削除します。必ず「i--;」を使用する必要があります。残りの敵をループする予定がある場合は、ループの一番下にも。「i--」または「break」、おそらくそのループでそれらのいずれかが必要になります。

削除方法を実行する順序を再確認してください。同じループで後で必要になる可能性のあるアイテムを削除するよりも、アイテムに削除フラグを付けて別のループで削除する方が良い場合があります。

for (var i:int = 0; i < DocumentClass.enemyList1.length; i++){
  if(DocumentClass.enemyList1[i] && DocumentClass.enemyList1[i].hit){
    if (hitTestObject(DocumentClass.enemyList1[i].hit)){
      trace("hitEnemy");
      removeSelf();
      DocumentClass.enemyList1[i].takeHit();
      break;
    }
  }
}
于 2013-07-13T19:47:00.750 に答える
0

この質問の正しい解決策ではありません。条件ステートメントではいつでも != null を実行できます。

if(object!=null){
    party.drink();
}
于 2013-07-14T01:23:45.253 に答える