Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 对象在碰到其他最近移除的对象的不可见版本时会卡住_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 对象在碰到其他最近移除的对象的不可见版本时会卡住

Actionscript 3 对象在碰到其他最近移除的对象的不可见版本时会卡住,actionscript-3,flash,Actionscript 3,Flash,大家好,我有一个简单的flash游戏的麻烦。到目前为止,一旦射弹击中物体,就很难移除它们 浏览网站后发现add.parent.removeChild(wtv);删除对象。使用时,我的玩家发射的物体击中一个物体,两个物体都会被移除,但当在同一位置发射另一个物体时,被发射的物体会击中一个刚刚被移除的不可见物体,然后在该位置移除,而不是一直持续到舞台结束或另一个物体被击中。这似乎只有在移除激发的对象时才会发生 这是代码,我认为问题在于moveLaser功能,如果需要更多信息,请让我知道,任何建议都会很

大家好,我有一个简单的flash游戏的麻烦。到目前为止,一旦射弹击中物体,就很难移除它们

浏览网站后发现add.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;
        }
    }
}
包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.events.KeyboardEvent;
导入flash.ui.Keyboard;
导入flash.display3D.IndexBuffer3D;
公共类级别_1扩展了MovieClip{
私人玩家:宇宙飞船;
私有变量对象:数组;
私有变量probMoveObj:int;
私人品牌:1级品牌;
公共职能级别_1(){
addEventListener(Event.ADDED_至_阶段,OnAddedStatage);
}
AddedStatage上的公共函数(事件:事件):无效{
移除EventListener(Event.ADDED_至_阶段,OnAddedStatage);
probMoveObj=1;
bgStars=新的级别1_stars();
player=新宇宙飞船();
对象=新数组(50);
bgStars.vx=50;
addChild(bgStars);
for(变量i:int=0;i=0){
player.y-=10;
追踪;
}
}
else if(event.keyCode==Keyboard.DOWN){
如果((player.y+(player.height/2))=0){
player.x-=10;
痕迹(“左”);
}
}
else if(event.keyCode==Keyboard.RIGHT){
if(player.x+(player.width/2)stage.stageWidth){
痕迹(“激光移除”);
removeEventListener(Event.ENTER_FRAME,moveLaser);
if(激光父级){
laser.parent.removeChild(激光);
}
}
否则{
激光x+=20;
}
}
}

}您的
激光
对象附加到
,但您出于某种奇怪的原因调用了
激光.removeChild()
,本质上要求
激光
将自身移除。您忽略了
父对象

laser.parent.removeChild(laser);
另外,如果你的激光同时到达舞台边缘并击中同一帧上的
游戏对象,你会连续两次尝试移除
激光
,出现1009错误,第一次调用null
激光。父方
第二次调用将调用null引用方法。你也必须解决这个问题,可能是via
if(laser.parent)
与处理对象时一样

更新:您还从错误的对象中删除了事件侦听器,将其连接到激光器,并从非激光器的
中删除。您应该执行以下操作:

laser.removeEventListener(Event.ENTER_FRAME, moveLaser);

谢谢你的回复!很抱歉,谢谢你注意到了这一点!这本应该在发布之前删除的。添加laser.parent后,我现在面临的问题是,激光被删除了,但当另一个激光击中最后一个被删除的位置时,就好像它击中了一个看不见的物体,并在该位置被删除,而不是携带直到它撞到另一个物体或超出边界。你知道为什么会发生这种情况吗?