Actionscript 3 Actionscript 3返回错误#1009

Actionscript 3 Actionscript 3返回错误#1009,actionscript-3,flash,function,null,event-listener,Actionscript 3,Flash,Function,Null,Event Listener,我正在制作一个射击游戏。当我决定创建一个方法在到达舞台顶部后移除导弹时,我的代码遇到了一个问题。我可以毫无问题地运行程序,但我知道,如果我按住射击按钮,导弹不会从舞台上移开。但是,如果我点击“射击”按钮,导弹将被移除,并在输出中打印出这个错误 有解决问题的办法吗 以下是导弹飞到舞台顶部并启用调试后的错误: TypeError: Error #1009: Cannot access a property or method of a null object reference. at Missle

我正在制作一个射击游戏。当我决定创建一个方法在到达舞台顶部后移除导弹时,我的代码遇到了一个问题。我可以毫无问题地运行程序,但我知道,如果我按住射击按钮,导弹不会从舞台上移开。但是,如果我点击“射击”按钮,导弹将被移除,并在输出中打印出这个错误

有解决问题的办法吗

以下是导弹飞到舞台顶部并启用调试后的错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Missle/destroyMissle()[E:\Experiment\ExperimentProject\Missle.as:39]
at main/checkMissleOffScreen()[E:\Experiment\ExperimentProject\main.as:63]
at main/eventUpdated()[E:\Experiment\ExperimentProject\main.as:51]
这是梅因的课:

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

/**
 * ...
 * @author test
 */
public class main extends MovieClip
{
    //Objects
    public var rect:MovieClip;
    public var missle:Missle;

    //Array
    private var missleArray:Array;

    //Keyboard section
    var leftKeyIsDown:Boolean;
    var rightKeyIsDown:Boolean;
    var upKeyIsDown:Boolean;
    var downKeyIsDown:Boolean;
    var spaceKeyIsDown:Boolean;

    //Speed
    var characterSpeed:Number = 15;

    //Main constructor
    public function main() 
    {
        //Array initializer
        missleArray = new Array();
        missle = new Missle();

        //Update events listeners.
        stage.addEventListener(Event.ENTER_FRAME, eventUpdated);

        //Update keyboard events listeners
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUnpressed);
    }

    //Events functions
    //This functions updated everytime the object is move
    private function eventUpdated(e:Event):void 
    {
        playerMoving();
        playerClampMoving();
        checkMissleOffScreen();
    }

    private function checkMissleOffScreen():void 
    {
        for (var i = 0; i < missleArray.length; i++ )
        {
            var currentMissle:Missle = missleArray[i];

            if (currentMissle.y < 0)
            {
                missleArray.splice(i, 1);
                missle.destroyMissle();

            }
        }
    }

    private function playerClampMoving():void 
    {
        if (rect.x < 0)
        {
            rect.x = 0;
        }
        if (rect.x > stage.stageWidth - rect.width)
        {
            rect.x = stage.stageWidth - rect.width;
        }
        if (rect.y < 0)
        {
            rect.y = 0;
        }
        if (rect.y > stage.stageHeight - rect.height)
        {
            rect.y = stage.stageHeight - rect.height;
        }
    }

    private function playerMoving():void 
    {
        if (leftKeyIsDown == true)
        {
            rect.x -= characterSpeed;
        }
        if (rightKeyIsDown == true)
        {
            rect.x += characterSpeed;
        }
        if (upKeyIsDown == true)
        {
            rect.y -= characterSpeed;
        }
        if (downKeyIsDown == true)
        {
            rect.y += characterSpeed;
        }
        if (spaceKeyIsDown == true)
        {
            shootingMissle();
        }
    }

    private function shootingMissle():void 
    {
        missle = new Missle();
        missle.x = rect.x + (rect.width / 2);
        missle.y = rect.y;

        missleArray.push(missle);
        trace(missleArray.length);

        stage.addChild(missle);
    }

    //Keyboard functions
    //Check to see whether the user releases the keyboard
    private function keyUnpressed(e:KeyboardEvent):void 
    {
        if (e.keyCode == 37)
        {
            leftKeyIsDown = false;
        }
        if (e.keyCode == 39)
        {
            rightKeyIsDown = false;
        }
        if (e.keyCode == 40)
        {
            downKeyIsDown = false;
        }
        if (e.keyCode == 38)
        {
            upKeyIsDown = false;
        }
        if (e.keyCode == 32)
        {
            spaceKeyIsDown = false;
        }
    }

    //Check to see whether the user presses the keyboard
    private function keyPressed(e:KeyboardEvent):void 
    {
        if (e.keyCode == 37)
        {
            leftKeyIsDown = true;
        }
        if (e.keyCode == 39)
        {
            rightKeyIsDown = true;
        }
        if (e.keyCode == 40)
        {
            downKeyIsDown = true;
        }
        if (e.keyCode == 38)
        {
            upKeyIsDown = true;
        }
        if (e.keyCode == 32)
        {
            spaceKeyIsDown = true;
        }
     }

   }

}
试试这个:

public function destroyMissle():void
{
    if(parent !== null) parent.removeChild(this);
    removeEventListener(Event.ENTER_FRAME, missleLaunch);
}
您可能多次调用了
.destroy()
,这意味着
父级
将为空,因为您已将其从后台删除,但它没有父级

public function destroyMissle():void
{
    if(parent !== null) parent.removeChild(this);
    removeEventListener(Event.ENTER_FRAME, missleLaunch);
}