0

/问题/

我已经在这里待了大约一个星期,但仍然找不到问题。我使用了跟踪语句,但我不知道是这个还是那个。因为我自己还很缺乏经验。我正在使用 Flash 开发。谢谢。

/* 这是我得到的错误,我正在尝试删除 dango 一旦它被破坏并在游戏结束后再次删除它 */

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mcDango/destoryDango()[J:\catchMeDango\mcDango.as:72]
    at catchMeDango/checkEndGameCondition()[J:\catchMeDango.as:195]
    at catchMeDango/gameLoop()[J:\catchMeDango\catchMeDango.as:171]

---------------------------------------------------------------------------------------

/*这是catchMeDango文档*/

package  
{
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.utils.Timer;

    /**
     * ...
     * @author 
     */
    public class catchMeDango extends MovieClip 
    {
        public var skewerPlayer:MovieClip;

        private var leftKeyIsDown:Boolean;
        private var rightKeyIsDown:Boolean;
        private var upKeyIsDown:Boolean;
        private var downKeyIsDown:Boolean;

        private var aDangoArray:Array;
        private var aBlackDangoArray:Array;

        public var scoreTxt:TextField;
        public var lifeTxt:TextField;
        public var menuEnd:mcEndGameScreen;

        private var nScore:Number;
        private var nLife:Number;
        private var tDangoTimer:Timer;
        private var tBlackDangoTimer:Timer;
        private var menuStart:mcStartGameScreen;
        private var startHow:Loader;

        public function catchMeDango() 
        {   
            //hides the endGameScreen
            menuEnd.hideScreen();

            //Create loader object
            var startLoader:Loader = new Loader();
            //Add event listener to listen the complete event
            startLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startLoaded);
            //Load our loader object
            startLoader.load(new URLRequest("startGameScreen.swf"));
        }

        private function startHowToPlay(e:Event):void 
        {
            //Create loader object
            startHow = new Loader();
            //Add event listener to listen the complete event
            startHow.contentLoaderInfo.addEventListener(Event.COMPLETE, HowToPlay);
            //Load our loader object
            startHow.load(new URLRequest("howToPlay.swf"));
        }

        private function HowToPlay(e:Event):void 
        {
            //add the how to play movie clip to stage
            addChild(startHow);
            startHow.addEventListener("BEGIN_GAME", playGameAgain);
        }

        private function startLoaded(e:Event):void 
        {
            //Get a reference to the loaded movieclip
            menuStart = e.target.content as mcStartGameScreen;
            //Listen for start game event
            menuStart.addEventListener("START_GAME", playGameAgain);
            menuStart.addEventListener("HOW_TO_PLAY", startHowToPlay);
            //Add to stage
            addChild(menuStart);
        }

        private function playGameAgain(e:Event):void 
        {   
            //I had to remove this function becuase is was causing errors
            //When I click on the "how to play" then go back to the start screen, it hides fine with no issues
            //startHow.visible = false;
            menuStart.visible = false;

            //set keyboard control to false
            leftKeyIsDown = false; 
            rightKeyIsDown = false;
            upKeyIsDown = false;
            downKeyIsDown = false;

            //Initialize variables
            aDangoArray = new Array();
            aBlackDangoArray = new Array();
            nScore = 0;
            nLife = 1;

            skewerPlayer.visible = true;

            menuStart.hideScreen();

            menuEnd.addEventListener("PLAY_AGAIN", playGameAgain);
            menuEnd.hideScreen();

            updateScoreText();
            updateLifeText();

            //trace ('Catch Me Dango Loaded');
            //Set up listerners for when an key is pressed
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);

            //Set up a game loop listener
            stage.addEventListener(Event.ENTER_FRAME, gameLoop)

            //Create a timer object for Dango for every 1 second
            tDangoTimer = new Timer(1000)
            //Listen for timer ticks/intervals
            tDangoTimer.addEventListener(TimerEvent.TIMER, addDango)
            //Start timer object
            tDangoTimer.start();

            //Create a timer object for Black Dango for every 10 seconds
            tBlackDangoTimer = new Timer(10000)
            //Listen for timer ticks/intervals
            tBlackDangoTimer.addEventListener(TimerEvent.TIMER, addBlackDango)
            //start timer object
            tBlackDangoTimer.start();
        }

        //Display Score Text (Starting form: 0)
        private function updateScoreText():void
        {
            scoreTxt.text = "Score: " + nScore;
        }

        //Display Life Text (Starting from: 5)
        private function updateLifeText():void
        {
            lifeTxt.text = "Life: " + nLife;
        }

        private function addBlackDango(e:TimerEvent):void 
        {
            //create new black dango object
            var newBlackDango:mcBlackDango = new mcBlackDango();
            //Add our new black dango 
            stage.addChild(newBlackDango);
            aBlackDangoArray.push(newBlackDango);
            trace(aBlackDangoArray.length);
        }

        private function addDango(e:TimerEvent):void 
        {
            //create new dango(enemy) object
            var newDango:mcDango = new mcDango();
            //Create enemy to the stage
            stage.addChild(newDango);
            //Add our new dango(enemy) to dango(enemy) array collection
            aDangoArray.push(newDango);
            trace(aDangoArray.length);
        }

        private function gameLoop(e:Event):void 
        {
            playerContorl();
            clampPlayerToStage();
            checkDangosOffScreen();
            checkSkewerHitsDango();
            checkBlackDangosOffScreen();
            checkSkwerHitsBlackDango();
            checkEndGameCondition();
        }

        //HELP
        private function checkEndGameCondition():void 
        {
            //Check if the player has 0 life left
            if (nLife == 0) 
            {
                //Stop player movement
                stage.removeEventListener(KeyboardEvent.KEY_UP, keyUp);
                stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDown);

                //Hide the player
                skewerPlayer.visible = false;

                //Stop spawning dango and black dango
                tDangoTimer.stop();
                tBlackDangoTimer.stop();

                //Clear the dango currently on screen
                for each(var dango:mcDango in aDangoArray)
                {   
                    //this destory function had to be removed as well. because it was destorying the dango twice when it was already removed from the stage.
                    //by commenting out this, it was able to destory and remove without any errors and only doing it once.
                    //Destory the dango the were curretly up to in the for loop
                    dango.destoryDango();
                    trace("black dango removed")
                    //Remove from dango from dango array
                    aDangoArray.splice(0, 1); 
                }

                //Clear the black dango currently on screen
                for each(var blackDango:mcBlackDango in aBlackDangoArray)
                {
                    //Destory the dango tat were curretly up to in the for loop
                    blackDango.destoryBlackDango();
                    //Remove from dango from dango array
                    aBlackDangoArray.splice(0, 1); 
                }

                //Stop the game loop
                if (aDangoArray.length == 0 && aBlackDangoArray.length == 0)
                {
                stage.removeEventListener(Event.ENTER_FRAME, gameLoop);
                }

                //Show end game screen
                menuEnd.showScreen();
            }
        }

        // Checks if the Skewer Hits or makes conatct with the Black Dango
        private function checkSkwerHitsBlackDango():void 
        {
            //Loop through our current Black dango
            for (var i:int = 0; i < aBlackDangoArray.length; i++)
            {
                //Get our current Black Dango in the loop
                var currentBlackDango:mcBlackDango = aBlackDangoArray[i];

                //Test if our skewer is hitting the black dango
                if (skewerPlayer.hitTestObject(currentBlackDango))
                {
                    //remove the current dango from stage
                    currentBlackDango.destoryBlackDango()
                    //Remove the dango from out dango array
                    aBlackDangoArray.splice(i, 1);

                    //Minus one to our score
                    nScore--;
                    updateScoreText();

                    //Minus one to our life
                    nLife--;
                    updateLifeText();
                }   
            }
        }

        // Remove the black dango of the stage and from the array
        private function checkBlackDangosOffScreen():void 
        {
            //loop through all our black dango
            for (var i:int = 0; i < aBlackDangoArray.length; i++)
            {
                //Get our current dango in the loop
                var currentBlackDango:mcBlackDango = aBlackDangoArray[i];
                //When dango starts on the top AND our curent enemy has gone past the bottom side if the stage
                if (currentBlackDango.y > (stage.stageHeight + currentBlackDango.y / 2))
                {
                    //Remove black dango (enemy) from array
                    aBlackDangoArray.splice(i, 1);
                    //Remove black dango (enemy) from stage
                    currentBlackDango.destoryBlackDango();
                }
            }
        }

        // Checks if the Skewer Hits or makes conatct with the Dango
        private function checkSkewerHitsDango():void 
        {
            //Loop through all our current dango
            for (var i:int = 0; i < aDangoArray.length; i++)
            {
                //Get our current dango in the loop
                var currentDango:mcDango = aDangoArray[i];

                //Test if our skewer is hitting dango
                if (skewerPlayer.hitTestObject(currentDango))
                {
                    //remove the current dango from stage
                    currentDango.destoryDango()
                    //Remove the dango from out dango array
                    aDangoArray.splice(i, 1);

                    //Add one to our score
                    nScore++;
                    updateScoreText();
                }

            }

        }

        // Remove the dango of the stage and from the array
        private function checkDangosOffScreen():void 
        {
            //loop through all our dangos(enemies)
            for (var i:int = 0; i < aDangoArray.length; i++)
            {
                //Get our current dango in the loop
                var currentDango:mcDango = aDangoArray[i];

                //When dango starts on the top AND our curent enemy has gone past the bottom side if the stage
                if (currentDango.y > (stage.stageHeight + currentDango.y / 2))
                {
                    //Remove dango (enemy) from array
                    aDangoArray.splice(i, 1);
                    //Remove dango (enemy) from stage
                    currentDango.destoryDango();
                } 
            }   

        }

        private function clampPlayerToStage():void 
        {
            //If our player is to the left of the stage
            if (skewerPlayer.x < skewerPlayer.width/2)
            {

                //Set our player to left of the stage
                skewerPlayer.x = skewerPlayer.width/2;
            } else if (skewerPlayer.x > (stage.stageWidth - (skewerPlayer.width / 2)))

            //If our player is to the right of the stage
            {

                //Set our player to right of the stage
                skewerPlayer.x = stage.stageWidth - (skewerPlayer.width / 2);
            }

            //If our player is to the top(up) of the stage
            if (skewerPlayer.y  < 0)
            {

                //Set our player to the top(up) of the stage
                skewerPlayer.y = 0;
            } else if (skewerPlayer.y > (stage.stageHeight - (skewerPlayer.height / 1)))

            //If our player is to the bottom(down) of the stage
            {

                //Set our player to the bottom(down) of the stage
                skewerPlayer.y = stage.stageHeight - (skewerPlayer.height / 1);
            }
        }

        // right, left, top and bottom Key Functions
        private function playerContorl():void 
        {
            //if our left key is currently down
            if (leftKeyIsDown == true)
            {

                //move our player to the left
                skewerPlayer.x -= 5;
            }
            //if our right key is currently down
            if (rightKeyIsDown) 
            {

                //move our player to the right
                skewerPlayer.x += 5;
            }
            //if our up key is currently down
            if (upKeyIsDown) 
            {

                //move our player to the top
                skewerPlayer.y -= 5;
            }
            //if our down key is currently down
            if (downKeyIsDown) 
            {

                //move our player to the bottom
                skewerPlayer.y += 5;
            }

        }

        private function keyUp(e:KeyboardEvent):void 
        {   
            //if our left key is released
            if (e.keyCode == 37)
            {
                //left key is released  
                leftKeyIsDown = false;
            }
            //if our right key is released
            if (e.keyCode == 39)
            {
                //right key is released
                rightKeyIsDown = false;
            }
            //if our up key is released
            if (e.keyCode == 38)
            {
                //up key is released    
                upKeyIsDown = false;
            }
            //if our down key is released
            if (e.keyCode == 40)
            {
                //down key is released
                downKeyIsDown = false;
            }
        }

        private function keyDown(e:KeyboardEvent):void
        {
            //if our left key is pressed
            if (e.keyCode == 37)
            {
                //left key is pressed   
                leftKeyIsDown = true;
            }
            //if our right key is pressed
            if (e.keyCode == 39)
            {
                //right key is pressed
                rightKeyIsDown = true;
            }   
            //if our up key is pressed
            if (e.keyCode == 38)
            {
                //up key is pressed 
                upKeyIsDown = true;
            }
            //if our down key is pressed
            if (e.keyCode == 40)
            {
                //right key is pressed
                downKeyIsDown = true;
            }   
        }

    }

}

---------------------------------------------------------------------------------

/*这是给 mcDango 文档的 */

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

    /**
     * ...
     * @author 
     */
    public class mcDango extends MovieClip 
    {
        private var nSpeed:Number;
        private var nRandom:Number;

        public function mcDango() 
        {
            // listen for when the Dango is added to the stage
            addEventListener(Event.ADDED_TO_STAGE, onAdd);
        }

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

        private function init():void 
        {   //Number of frames you have in Flash
            var nDango:Number = 12;
            //Pick random number between 1 and our number of enemies(dango)
            var nRandom:Number = randomNumber(1, nDango)
            //Setup our player of this enemey(dango) clip to pur random dango
            this.gotoAndStop(nRandom);
            //Setup our enemies(dango) start position
            setupStartPosition();
        }

        private function setupStartPosition():void 
        {
            //Pick a random speed for enemy(dango)
            nSpeed = randomNumber(5, 10);

            //Set your ramdon X postion
            nRandom = randomNumber(9, 775);

            //Start our enemy(dango) on the top side
            this.y = -50;

            //set random pos X
            this.x = nRandom

            //move our enmey(dango)
            startMoving();
        }

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

        private function dangoLoop(e:Event):void 
        {
            //Test what direction our enemy(dango) is moving in
            //If our enemy(dango) is moving right

            //Move our enemy(dango) down
            this.y += nSpeed
        }

        public function destoryDango():void
        {
            //Remove dango from stage
            parent.removeChild(this);
            trace("the dango has been removed")
            //Remove any event listeners in our enemy object
            removeEventListener(Event.ENTER_FRAME, dangoLoop);
        }

        function randomNumber(low:Number=0, high:Number=1):Number
        {
            return Math.floor(Math.random() * (1+high-low)) + low;  
        }
    }
}
4

2 回答 2

0

看一眼代码,看起来问题出在 for-each-in 循环之后

for each(var dango:mcDango in aDangoArray) {   
//this destory function had to be removed as well. because it was destorying the dango twice when it was already removed from the stage.
//by commenting out this, it was able to destory and remove without any errors and only doing it once.
//Destory the dango the were curretly up to in the for loop
dango.destoryDango();
trace("black dango removed")
//Remove from dango from dango array
aDangoArray.splice(0, 1);
}

检查使用

while(aDangoArray.length > 0) {
var dango = aDangoArray[0]
dango.destoryDango();
trace("black dango removed")
aDangoArray.splice(0, 1);
}
于 2012-07-06T11:43:49.300 回答
0

好吧,看起来问题出在您尝试访问 parent.removeChild 方法时。也许你已经把它从舞台上移除了,它不再有父级了。尝试这样做:

    public function destoryDango():void
    {
        //Remove dango from stage
        if(parent != null)
            parent.removeChild(this);
        trace("the dango has been removed")
        //Remove any event listeners in our enemy object
        removeEventListener(Event.ENTER_FRAME, dangoLoop);
    }
于 2013-12-05T03:32:25.377 回答