Actionscript 3.0,hitTestObject错误

时间:2013-07-13 17:24:52

标签: actionscript-3 hittest

我收到的错误似乎无法解决。我想我知道发生了什么,但我不确定是否能够修复它。我一直收到错误

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

    }

}

不要认为你应该需要我的任何其他课程来弄清楚发生了什么,但如果你这样做,请告诉我!非常感谢=)

2 个答案:

答案 0 :(得分:1)

您不希望针对可能已从场景(或来自enemyList数组)中移除的任何对象执行命中测试。添加到attack1.loop的for循环的额外条件应该摆脱你的错误。更好的解决方法是拼出你删除的项目,因此它们永远不会在循环中进行测试。

断线将使其在子弹被移除后停止尝试击中其他敌人。如果行“DocumentClass.enemyList1 [i] .takeHit();”从enemyList1中删除该项,您需要确保使用“i--;”如果你计划循环其余的敌人,也可以在循环的底部。 “我 - ”或“休息”,你可能会在那个循环中需要其中一个。

仔细检查执行删除方法的顺序。有时最好标记要删除的项目并在单独的循环中删除它们,而不是删除稍后在同一循环中可能需要的项目。

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

答案 1 :(得分:0)

这个问题不是正确的解决方案。您总是可以在条件语句中执行!= null。

if(object!=null){
    party.drink();
}