1

こんにちは 単純なフラッシュゲームで困っています。これまでのところ、オブジェクトに命中した発射体を取り除くのは困難です。

サイトを通過した後、.parent.removeChild(wtv); を追加することがわかりました。オブジェクトを削除します。プレイヤーによって発射されたオブジェクトを使用すると、両方が削除されますが、同じ位置で別のオブジェクトが発射されると、発射されたオブジェクトは、削除されたばかりの目に見えないオブジェクトにヒットし、その位置で削除されます。ステージの端または別のオブジェクトがヒットします。これは、発射されたオブジェクトが削除されたときにのみ発生するようです。

これはコードです。問題は moveLaser 関数にあると考えられます。これ以上情報が必要な場合はお知らせください。どのような推奨事項も素晴らしいと思います。ありがとうございます。

package{

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display3D.IndexBuffer3D;


public class Level_1 extends MovieClip{
    private var player:SpaceShip;
    private var objects:Array;
    private var probMoveObj:int;
    private var bgStars:Level1_stars;

    public function Level_1(){
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    public function onAddedToStage(event:Event):void{
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        probMoveObj = 1;

        bgStars = new Level1_stars();
        player = new SpaceShip();
        objects = new Array(50);

        bgStars.vx = 50;
        addChild(bgStars);

        for(var i:int = 0; i < objects.length; i++){
            objects[i] = new GameObject();
            addGameObjects(objects[i]);
        }

        player.x = 100;
        player.y = stage.stageHeight - 250;
        addChild(player);

        bgStars.addEventListener(Event.ENTER_FRAME, moveBackground);
        player.addEventListener(Event.ENTER_FRAME, movePlayer);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKey);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, checkFire);

    }

    public function movePlayer(event:Event):void{

        /*for(var i:int = 0; i < objects.length; i++){
            if(objects[i].hitTestObject(player.hit)){
                objects[i].removeEventListener(Event.ENTER_FRAME, moveObject);
                trace("HIT");
            }
        }*/
    }

    public function checkFire(event:KeyboardEvent):void{
        if(event.keyCode == Keyboard.SPACE){
            trace("SPACE");
            var laser:Ship_laser = new Ship_laser();
            var laser2:Ship_laser = new Ship_laser();
            laser.x  = player.x + 30;
            laser2.x = player.x + 30;
            laser.y = player.y - 30;
            laser2.y = player.y + 30;
            laser.addEventListener(Event.ENTER_FRAME, moveLaser);
            laser2.addEventListener(Event.ENTER_FRAME, moveLaser);
            addChild(laser);
            addChild(laser2);
        }
    }

    public function checkKey(event:KeyboardEvent):void{

        if(event.keyCode == Keyboard.UP){
            if((player.y - (player.height / 2)) >= 0){
                player.y -= 10;
                trace("UP");
            }
        }
        else if(event.keyCode == Keyboard.DOWN){
            if((player.y +(player.height / 2)) <= stage.stageHeight){
                player.y += 10;
                trace("down");
            }
        }
        else if(event.keyCode == Keyboard.LEFT){
            if(player.x - (player.width / 2) >= 0){
                player.x -= 10;
                trace("LEFT");
            }
        }
        else if(event.keyCode == Keyboard.RIGHT){
            if(player.x + (player.width / 2) <= stage.stageWidth){
                player.x += 10;
                trace("RIGHT");
            }
        }
    }

    public function addGameObjects(gameObj:GameObject):void{
        // position the object randomly, but to the right of the player
            gameObj.x = stage.stageWidth + (Math.ceil(Math.random() * (4000 + gameObj.width/2)));
            gameObj.y = Math.ceil(Math.random() * (stage.stageHeight - 100 - gameObj.height/2));
            // add object to the stage
            addChild(gameObj);
            // set the velocity of the object
            gameObj.vx = -Math.ceil((Math.random() + 1) * 2);
            // move the object each frame
            gameObj.addEventListener(Event.ENTER_FRAME, moveObject);
    }

    private function moveObject(event:Event):void
    {
        var gameObj:GameObject = event.target as GameObject;
        gameObj.x += gameObj.vx;
    }

    private function moveBackground(event:Event):void{

        if(bgStars.x < ((bgStars.width / 2 + 100) * -1)){
            bgStars.x = 0;   
        }
        else{
            bgStars.x -= bgStars.vx;
        }
    }

    private function moveLaser(event:Event):void{

        var laser:Ship_laser = event.target as Ship_laser;

        for(var i:int = 0; i < objects.length; i++){
            if(objects[i].hitTestObject(laser.hit)){
                objects[i].removeEventListener(Event.ENTER_FRAME, moveObject);
                if(objects[i].parent){
                    objects[i].parent.removeChild(objects[i]);
                }

                removeEventListener(Event.ENTER_FRAME, moveLaser);
                if(laser.parent){
                    laser.parent.removeChild(laser);
                }

            }
        }

        if(laser.x > stage.stageWidth){
            trace("LASER REMOVED");

            removeEventListener(Event.ENTER_FRAME, moveLaser);
            if(laser.parent){
                laser.parent.removeChild(laser);
            }
        }
        else{
            laser.x += 20;
        }
    }
}

}

4

1 に答える 1

2

あなたのlaserオブジェクトは に添付されてthisいますが、何らかの奇妙な理由で、それ自体からそれ自体を削除することをlaser.removeChild()本質的に要求しています。laserあなたはそこを省略parentしました。

laser.parent.removeChild(laser);

また、レーザーがステージの端に到達gameObjectし、同じフレームにヒットする場合、欠陥があります。2 回続けて削除しようとすると、1009 エラーが発生します。laser最初に nulllaser.parentを呼び出し、2 回目の呼び出しでメソッドを呼び出します。 null 参照の。おそらくオブジェクトで行ったように、この問題も修正するif (laser.parent)必要があります。

更新:イベントリスナーも間違ったオブジェクトから削除し、レーザーにアタッチし、レーザーでthisはないオブジェクトから削除します。やったほうがいい:

laser.removeEventListener(Event.ENTER_FRAME, moveLaser);
于 2013-04-02T03:27:19.763 に答える