-1

シューティングゲームを作っています。ステージの最上部に到達した後にミサイルを削除するメソッドを作成することにしたときに、コードに問題が発生しました。問題なくプログラムを実行できますが、発射ボタンを押したままにすると、ミサイルがステージから取り除かれなかったことだけはわかりました。ただし、発射ボタンをタップすると、このエラー #1009 が出力に出力されてミサイルが削除されます。

問題を解決する解決策はありますか?

デバッグを有効にしてミサイルがステージの一番上まで飛んだ後のエラーは次のとおりです。

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

   }

}

ミサイルのクラスは次のとおりです。

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

/**
 * ...
 * @author test
 */
public class Missle extends Sprite 
{



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

    private function onAdd(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAdd);
        //Objects are on the stage
        init();
    }

    private function init():void 
    {
        addEventListener(Event.ENTER_FRAME, missleLaunch);
    }

    private function missleLaunch(e:Event):void 
    {
        this.y -= 15;
    }

    public function destroyMissle():void
    {
        parent.removeChild(this);
        removeEventListener(Event.ENTER_FRAME, missleLaunch);

    }

   }

}
4

1 に答える 1

1

これを試して:

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

.destroyMissile()ステージから削除しており、親がないため、意味parentが null になる可能性があります。

于 2013-05-10T02:19:46.883 に答える