Flash错误#1009

时间:2014-10-13 14:08:12

标签: actionscript-3 flash

我的AS3代码存在问题。错误是:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mcEnemy/destroyEnemy()[/Users/deorka12/Documents/School/firstGame/mcEnemy.as:94]
    at firstGame/checkEnemiesOffscreen()[/Users/deorka12/Documents/School/firstGame/firstGame.as:112]
    at firstGame/gameLoop()[/Users/deorka12/Documents/School/firstGame/firstGame.as:63]

这就是我的代码:

package {

    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    // public function kan je ook gebruiken in een ander as. file
    // private function kan je alleen gebruiken in hetzelfde as. file 
    public class firstGame extends MovieClip
    {

        public var mcPlayer:MovieClip;

        private var leftKeyIsDown:Boolean;
        private var rightKeyIsDown: Boolean;

        private var aMissileArray: Array;
        private var aEnemyArray: Array; 

        public function firstGame (){

            //initilaiz variables
            aMissileArray = new Array ();
            aEnemyArray = new Array ();

            //trace("First Game Loaded");
            //Listern for key presses and relesead

            stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
            //Setup game event loop
            stage.addEventListener(Event.ENTER_FRAME, gameLoop);

            // create a timer object
            var tEnemyTimer : Timer = new Timer (1000);
            // listener for timer intervals
            tEnemyTimer.addEventListener(TimerEvent.TIMER, addEnemy); 
            // start out timer
            tEnemyTimer.start();
        }

        private function addEnemy (e:TimerEvent) : void
        {
            //trace ("timer ticks")
            // create a new enemy object
            var newEnemy:mcEnemy = new mcEnemy ();
            // add object to the stage
            stage.addChild (newEnemy);
            // add enemy to new enemy to a new enemy array
            aEnemyArray.push(newEnemy);
            trace (aEnemyArray.length);

        }

        private function gameLoop (e:Event) : void
        {
            playerControl();
            clampPlayerToStage();
            checkMissileOffscreen();
            **checkEnemiesOffscreen();**
            checkMissilesHitsEnemy();
        }

        private function checkMissilesHitsEnemy (): void
        {
            // loop trough current missiles
            for (var i : int = 0 ; i < aMissileArray.length; i++)
            {
                // get our current missile in the  i loop
                var currentMissile : mcMissile = aMissileArray [i];

                // loop trough all our enemies
                // gebruik geen i want die is al gebruikt dus j
                for (var j: int = 0 ; j < aEnemyArray.length; j++)
                {
                    // get the current enemy in the j loop
                    var currentEnemy: mcEnemy = aEnemyArray [j];

                    // test if our current enemy is hitting our current missile
                    if(currentMissile.hitTestObject(currentEnemy))
                    {
                        // remove the missile
                        currentMissile.destroyMissile();
                        // remove the missile from missile array
                        aMissileArray.splice(i, 1);
                        // remove the enemy from the stage
                        **currentEnemy.destroyEnemy();**
                        // remove the enemy from the enemy array
                        aEnemyArray.splice(j, 1);
                    }
                }

            }
        }

        private function checkEnemiesOffscreen (): void
        {
            // loop trough all our enemies
            for (var i:int = 0;i < aEnemyArray.length; i++)
            {
                // get our current ememy in the loop
                var currentEnemy: mcEnemy = aEnemyArray [i];
                // when enemy moves left and is has gone past the and of the left from the stage
                if (currentEnemy.sDirection == "L" && currentEnemy.x  - (currentEnemy.width/2))
                {
                    // Remove enemy from our array
                    aEnemyArray.slice(i,1); 
                    // Remove enemy from stage
                    currentEnemy.destroyEnemy();
                } else
                if (currentEnemy.sDirection == "R" && currentEnemy.x > stage.stageWidth + (currentEnemy.width/2))
                {
                    // Remove enemy from our array
                    aEnemyArray.slice(i,1); 
                    // Remove enemy from stage
                    currentEnemy.destroyEnemy();
                }

            }
        }

        private function checkMissileOffscreen():void
        {
            //Loop throw all our missiles in our missle array
                // i = counter object
            for (var i: int = 0; i < aMissileArray.length; i++)
            {
                //Get the current missile in the loop
                var currentMissile : mcMissile = aMissileArray [i];
                //Test if current missile is out the buttom of the screen
                if (currentMissile.y > 450 )
                {
                        //Remove current missile from the array
                        aMissileArray.splice(i,1);
                        //Destroy our missile
                        currentMissile.destroyMissile();
                }

            }
        }

        private function clampPlayerToStage ():void
        {
            // if our player is to the left of the stage
            if (mcPlayer.x < (mcPlayer.width/2))
            {
                // set our player to left of the stage
                mcPlayer.x = mcPlayer.width/2;
            }
            // if our player is to the right of the stage
            else if (mcPlayer.x > (stage.stageWidth - (mcPlayer.width/2)))
            {
                //set our player to right of the stage
                mcPlayer.x = stage.stageWidth - (mcPlayer.width/2);
            }
        }

        private function playerControl ():void
        {
                // if our left key is down currently
            if (leftKeyIsDown == true)
            {
                    //move to left
                mcPlayer.x -= 5;
            }

                // if our right key is currently down
            if (rightKeyIsDown)
            {
                    //move to right
                mcPlayer.x += 5;
            }   
        }

        private function keyUp (e:KeyboardEvent): void
        {
            //trace(e.keyCode)
            //if your left is released
            if (e.keyCode == 37)
            {
                //left key is released
                leftKeyIsDown = false;
            }
            //if your right is released 
            if (e.keyCode == 39)
            {
                //right key is released
                rightKeyIsDown = false;
            }
            //if our spacebarr is released
            if (e.keyCode == 32)
            {
                //fire a missile
                fireMissile ();
            }

        }

        private function fireMissile ():void 
        {
            // create a new missisile object
            var newMissile : mcMissile = new mcMissile ();
            // add to stage
            stage.addChild(newMissile);
            // position missile
            newMissile.x = mcPlayer.x;
            newMissile.y = mcPlayer.y;
            //add our new missile to our missile array
            aMissileArray.push (newMissile);
            trace(aMissileArray.length)
        }

        private function keyDown (e:KeyboardEvent): void
        {

            //trace(e.keyCode)
            //if your left is pressed
            if (e.keyCode == 37)
            {
                //left key is pressed
                leftKeyIsDown = true;
            }
            //if your right is pressed
            if (e.keyCode == 39)
            {
                //right key is pressed
                rightKeyIsDown = true;
            }
        }


        }

    }

我的其他代码是:

package  {
    import flash.display.MovieClip;
    import flash.events.Event;

    public class mcEnemy extends MovieClip {

        public var sDirection:String;

        private var nSpeed:Number; 

        public function mcEnemy() 
        {
            addEventListener(Event.ADDED_TO_STAGE, onAdd);

        }

        private function onAdd (e:Event): void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, onAdd);
            init();
        }

        private function init ():void
        {
            // 3 frames
            var nEnemies:Number = 3;
            // pick random number between 1 and number of enemies
            var nRandom:Number = randomNumber (1, nEnemies);
            // Setup our playhead of this enemy clip to a random number
            // Stop op frame 1,2 of 3
            this.gotoAndStop(nRandom);
            // Setup our enemys start position
            setupStartPosition();
        }

        private function setupStartPosition (): void
        {
            // pick a random speed for the enemy
            nSpeed = randomNumber (5,10); 
            // Pick random number for left or right, start position
            var nLeftOrRight:Number = randomNumber (1,2);
            // if our nLeftOrRight == 1 , enemy is on the left
            if (nLeftOrRight == 1)
            {
                // start enemy on the left side
                this.x =  - (this.width/2);
                sDirection = "R";
            } else
            {
                // start enemy on the right side
                this.x = stage.stageWidth + (this.width/2);
                sDirection = "L";
            }
            // set a random hoogte for our enemy
            // set a 2 varibele for min and max hoogte
            var nMinAltitude: Number = stage.stageHeight/2;
            var nMaxAltitude: Number = 400 - (this.height/2);

            // Setup our enemies altitude to a random point between our min and max altitudes
            this.y = randomNumber (nMinAltitude, nMaxAltitude);

            // move our enemy
            startMoving ();
        }

        private function startMoving (): void
        {
            addEventListener(Event.ENTER_FRAME, enemyLoop)
        }

        private function enemyLoop (e:Event ): void
        {
            // test in what direction our enemy is moving
            // if our enemy is moving right
            if (sDirection == "R")
            {
                // move our enemy right
                this.x += nSpeed;
            } else
            {
                this.x -= nSpeed;
            }
        }

        // geeft random nummer tussen 0 en 1
        function randomNumber (low:Number=0, high:Number=1) : Number
        {
            return Math.floor (Math.random() * (1+high-low)) + low;
        }

            public function destroyEnemy (): void
        {
            // remove enemys from the stage
            **parent.removeChild(this);**
            // remove any eventlisteners from enemy
            removeEventListener(Event.ENTER_FRAME, enemyLoop);
        }

    }

}

我希望有人可以帮助我。抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

该错误表示属性parent为空,表示您的mcEnemy对象没有父对象。 mcEnemy对象尚未添加到显示列表中。

要解决此问题,您可以检查parent属性是否先设置:

if(parent)
{
    parent.removeChild(this);
}