Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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

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_State - Fatal编程技术网

Actionscript 3 如何定义一个孩子应该只出现在一个场景中?

Actionscript 3 如何定义一个孩子应该只出现在一个场景中?,actionscript-3,flash,state,Actionscript 3,Flash,State,我们正在制作一个太空撞击游戏。这是我们的三节课。我们的问题是,当我们在migonoite中创建时,它们会出现在整个游戏中(菜单、其他关卡等),而不是只出现在我们想要的场景中。我们应该如何限制儿童只出现在谋杀案中? 我们尝试了使用gotoandPlay,addChildAt,还尝试了在Inimigo类本身中创建Inimigo,而不是在主类中创建Inimigo,但它根本没有出现。有人能帮我们吗?多谢各位 键。作为 package { import flash.display.Stage;

我们正在制作一个太空撞击游戏。这是我们的三节课。我们的问题是,当我们在migonoite中创建
时,它们会出现在整个游戏中(菜单、其他关卡等),而不是只出现在我们想要的场景中。我们应该如何限制儿童只出现在谋杀案中?
我们尝试了使用
gotoandPlay
addChildAt
,还尝试了在Inimigo类本身中创建Inimigo,而不是在主类中创建Inimigo,但它根本没有出现。有人能帮我们吗?多谢各位

键。作为

package {

  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.KeyboardEvent;

    public class Key {

        private static var initialized:Boolean = false;
        private static var keysDown:Object = new Object();

        public static function initialize(stage:Stage) {
            if (!initialized) {
                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                stage.addEventListener(Event.DEACTIVATE, clearKeys);

                initialized = true;
            }
        }


        public static function isDown(keyCode:uint):Boolean 
        {
            return Boolean(keyCode in keysDown);
        }


        private static function keyPressed(event:KeyboardEvent):void {
            keysDown[event.keyCode] = true;
        }


        private static function keyReleased(event:KeyboardEvent):void {
            if (event.keyCode in keysDown) {
                delete keysDown[event.keyCode];
            }
        }

        private static function clearKeys(event:Event):void {

            keysDown = new Object();
        }
    }
} 
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class InimigoNoite extends MovieClip{

        var speed:Number;
        static var list:Array = new Array();
        var balaTimer: Timer;

        function InimigoNoite(){

            list.push(this);
            this.x = 1160;
            this.y = 150 + (450-150) * Math.random();
            speed = Math.random()*5 + 5;
            addEventListener("enterFrame", enterFrame);
            var intervalo: Number = Math.random()*500 + 1000;
            balaTimer = new Timer(intervalo);
            balaTimer.addEventListener("timer", bala);
            balaTimer.start();

        }

        function enterFrame (e:Event){

            this.x -= speed;
            if(this.x < -100){
                matar();
                return;
            }

            if(this.hitTestObject(SpaceImpact.navecnoite)){
                matar();
            }
        }

        function matar(){

            var explosao = new ExplosaoNoite();
            stage.addChild(explosao);
            explosao.x = this.x;
            explosao.y = this.y;

            balaTimer.stop();
            balaTimer.removeEventListener("timer",bala);

            removeEventListener("enterFrame", enterFrame);
            stage.removeChild(this);

            for(var i in list){
                if(list[i] == this){
                    delete list[i];
                }
            }
        }

        function bala(e:Event){

            var b = new BalaInimigo();
            b.x = this.x -50;
            b.y = this.y;
            stage.addChild(b);
        }
    }
}
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class SpaceImpact extends MovieClip{

    static var navecnoite:MovieClip;
    var inimigoNoiteTimer:Timer;

        function SpaceImpact(){
            Key.initialize(stage);
            inimigoNoiteTimer = new Timer(8000);
            inimigoNoiteTimer.addEventListener("timer", criaInimigo);
            inimigoNoiteTimer.start();
        }

        function criaInimigo(e:Event){
            var inimigo = new InimigoNoite();
            stage.addChild(inimigo);
            addChildAt(inimigo, 3);         
        } 
    }
}
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class MainGame extends MovieClip {

        private var inimigoNoiteTimer:Timer;

        public function MainGame() {
            this.addEventListener(Event.ADDED_TO_STAGE, addedToStage, false, 0, true); //don't do anything until this object has been added to the screen
        }

        private function addedToStage(e:Event):void {
            this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);

            //start spawning
            inimigoNoiteTimer = new Timer(8000);
            inimigoNoiteTimer.addEventListener("timer", criaInimigo);
            inimigoNoiteTimer.start();
        }

        function criaInimigo(e:Event){
            var inimigo = new InimigoNoite();
            addChild(inimigo);       
        } 

        //when whatever happens that makes your game finished
        function gameComplete():void {
            dispatchEvent(new Event(addEventListener.COMPLETE));
        }
    }
}
INIMIGO NOITE.as

package {

  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.KeyboardEvent;

    public class Key {

        private static var initialized:Boolean = false;
        private static var keysDown:Object = new Object();

        public static function initialize(stage:Stage) {
            if (!initialized) {
                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                stage.addEventListener(Event.DEACTIVATE, clearKeys);

                initialized = true;
            }
        }


        public static function isDown(keyCode:uint):Boolean 
        {
            return Boolean(keyCode in keysDown);
        }


        private static function keyPressed(event:KeyboardEvent):void {
            keysDown[event.keyCode] = true;
        }


        private static function keyReleased(event:KeyboardEvent):void {
            if (event.keyCode in keysDown) {
                delete keysDown[event.keyCode];
            }
        }

        private static function clearKeys(event:Event):void {

            keysDown = new Object();
        }
    }
} 
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class InimigoNoite extends MovieClip{

        var speed:Number;
        static var list:Array = new Array();
        var balaTimer: Timer;

        function InimigoNoite(){

            list.push(this);
            this.x = 1160;
            this.y = 150 + (450-150) * Math.random();
            speed = Math.random()*5 + 5;
            addEventListener("enterFrame", enterFrame);
            var intervalo: Number = Math.random()*500 + 1000;
            balaTimer = new Timer(intervalo);
            balaTimer.addEventListener("timer", bala);
            balaTimer.start();

        }

        function enterFrame (e:Event){

            this.x -= speed;
            if(this.x < -100){
                matar();
                return;
            }

            if(this.hitTestObject(SpaceImpact.navecnoite)){
                matar();
            }
        }

        function matar(){

            var explosao = new ExplosaoNoite();
            stage.addChild(explosao);
            explosao.x = this.x;
            explosao.y = this.y;

            balaTimer.stop();
            balaTimer.removeEventListener("timer",bala);

            removeEventListener("enterFrame", enterFrame);
            stage.removeChild(this);

            for(var i in list){
                if(list[i] == this){
                    delete list[i];
                }
            }
        }

        function bala(e:Event){

            var b = new BalaInimigo();
            b.x = this.x -50;
            b.y = this.y;
            stage.addChild(b);
        }
    }
}
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class SpaceImpact extends MovieClip{

    static var navecnoite:MovieClip;
    var inimigoNoiteTimer:Timer;

        function SpaceImpact(){
            Key.initialize(stage);
            inimigoNoiteTimer = new Timer(8000);
            inimigoNoiteTimer.addEventListener("timer", criaInimigo);
            inimigoNoiteTimer.start();
        }

        function criaInimigo(e:Event){
            var inimigo = new InimigoNoite();
            stage.addChild(inimigo);
            addChildAt(inimigo, 3);         
        } 
    }
}
package{

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;

    public class MainGame extends MovieClip {

        private var inimigoNoiteTimer:Timer;

        public function MainGame() {
            this.addEventListener(Event.ADDED_TO_STAGE, addedToStage, false, 0, true); //don't do anything until this object has been added to the screen
        }

        private function addedToStage(e:Event):void {
            this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);

            //start spawning
            inimigoNoiteTimer = new Timer(8000);
            inimigoNoiteTimer.addEventListener("timer", criaInimigo);
            inimigoNoiteTimer.start();
        }

        function criaInimigo(e:Event){
            var inimigo = new InimigoNoite();
            addChild(inimigo);       
        } 

        //when whatever happens that makes your game finished
        function gameComplete():void {
            dispatchEvent(new Event(addEventListener.COMPLETE));
        }
    }
}

你从不停止计时。因此,您的inimigo每8秒创建并添加一次。 在criaInimigo中停止计时器和/或使用timerComplete事件

 function SpaceImpact(){
    Key.initialize(stage); 
    inimigoNoiteTimer = new Timer(8000,1);
    inimigoNoiteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, criaInimigo);
    inimigoNoiteTimer.start();
}

function criaInimigo(e:Event){
    //inimigoNoiteTimer.stop();//only needed if you use the 'timer'-Event
    var inimigo = new InimigoNoite();
    stage.addChild(inimigo);
    addChildAt(inimigo, 3);         
} 

当应用程序启动时,您每8秒创建一个新的
InimigoNoite
。由于您要将它们添加到
阶段
,因此它们将显示在您时间线上的任何内容之上

问题(除了在应用程序启动时创建它们,并且从不停止计时器)是,当您通过代码使用
addChild
时,该子对象将一直留在屏幕上,直到通过
removeChild
显式删除它(或者它的一个父对象是-但由于父对象是
stage

我看到您在
InimigoNoite
类中有一个命中测试,可以潜在地删除它,但我看不到您在其他任何地方删除它(因此,如果命中测试从未发生,它将永远不会从舞台上删除,无论场景如何)

似乎解决问题的方法是提供更多关于如何构建应用程序的建议

不要使用场景。

最好是为游戏的每个不同状态创建一个类文件。下面是一个基本的例子:

  • 主菜单状态
  • 游戏状态(包含所有关卡的1个游戏状态,或每个关卡的一个状态-或两者-取决于关卡之间功能的变化程度)
  • 国家的游戏
  • 让您的游戏状态类文件扩展
    Sprite
    MovieClip
    ,如果需要,您甚至可以在flash pro中创建一个新的
    MovieClip
    ,并将类附加到该文件上(从而能够在时间线上删除视觉资源)

    因此,您的主类将只负责管理状态(以及应用程序全局的任何其他内容)

    然后,您的游戏状态,例如: MainGame.as

    package {
    
      import flash.display.Stage;
      import flash.events.Event;
      import flash.events.KeyboardEvent;
    
        public class Key {
    
            private static var initialized:Boolean = false;
            private static var keysDown:Object = new Object();
    
            public static function initialize(stage:Stage) {
                if (!initialized) {
                    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                    stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                    stage.addEventListener(Event.DEACTIVATE, clearKeys);
    
                    initialized = true;
                }
            }
    
    
            public static function isDown(keyCode:uint):Boolean 
            {
                return Boolean(keyCode in keysDown);
            }
    
    
            private static function keyPressed(event:KeyboardEvent):void {
                keysDown[event.keyCode] = true;
            }
    
    
            private static function keyReleased(event:KeyboardEvent):void {
                if (event.keyCode in keysDown) {
                    delete keysDown[event.keyCode];
                }
            }
    
            private static function clearKeys(event:Event):void {
    
                keysDown = new Object();
            }
        }
    } 
    
    package{
    
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.utils.Timer;
    
        public class InimigoNoite extends MovieClip{
    
            var speed:Number;
            static var list:Array = new Array();
            var balaTimer: Timer;
    
            function InimigoNoite(){
    
                list.push(this);
                this.x = 1160;
                this.y = 150 + (450-150) * Math.random();
                speed = Math.random()*5 + 5;
                addEventListener("enterFrame", enterFrame);
                var intervalo: Number = Math.random()*500 + 1000;
                balaTimer = new Timer(intervalo);
                balaTimer.addEventListener("timer", bala);
                balaTimer.start();
    
            }
    
            function enterFrame (e:Event){
    
                this.x -= speed;
                if(this.x < -100){
                    matar();
                    return;
                }
    
                if(this.hitTestObject(SpaceImpact.navecnoite)){
                    matar();
                }
            }
    
            function matar(){
    
                var explosao = new ExplosaoNoite();
                stage.addChild(explosao);
                explosao.x = this.x;
                explosao.y = this.y;
    
                balaTimer.stop();
                balaTimer.removeEventListener("timer",bala);
    
                removeEventListener("enterFrame", enterFrame);
                stage.removeChild(this);
    
                for(var i in list){
                    if(list[i] == this){
                        delete list[i];
                    }
                }
            }
    
            function bala(e:Event){
    
                var b = new BalaInimigo();
                b.x = this.x -50;
                b.y = this.y;
                stage.addChild(b);
            }
        }
    }
    
    package{
    
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.utils.Timer;
    
        public class SpaceImpact extends MovieClip{
    
        static var navecnoite:MovieClip;
        var inimigoNoiteTimer:Timer;
    
            function SpaceImpact(){
                Key.initialize(stage);
                inimigoNoiteTimer = new Timer(8000);
                inimigoNoiteTimer.addEventListener("timer", criaInimigo);
                inimigoNoiteTimer.start();
            }
    
            function criaInimigo(e:Event){
                var inimigo = new InimigoNoite();
                stage.addChild(inimigo);
                addChildAt(inimigo, 3);         
            } 
        }
    }
    
    package{
    
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.utils.Timer;
    
        public class MainGame extends MovieClip {
    
            private var inimigoNoiteTimer:Timer;
    
            public function MainGame() {
                this.addEventListener(Event.ADDED_TO_STAGE, addedToStage, false, 0, true); //don't do anything until this object has been added to the screen
            }
    
            private function addedToStage(e:Event):void {
                this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
    
                //start spawning
                inimigoNoiteTimer = new Timer(8000);
                inimigoNoiteTimer.addEventListener("timer", criaInimigo);
                inimigoNoiteTimer.start();
            }
    
            function criaInimigo(e:Event){
                var inimigo = new InimigoNoite();
                addChild(inimigo);       
            } 
    
            //when whatever happens that makes your game finished
            function gameComplete():void {
                dispatchEvent(new Event(addEventListener.COMPLETE));
            }
        }
    }
    

    我们正在使用。作为外部类,而不是时间线内的操作。roncon222,您找到解决问题的方法了吗?是的,我们找到了,但我们使用了另一种方法。我们使用了一个名为EnvieInImigo的函数(基本上是SendEquire),该函数有一个计数器,用于定义我们发送的敌人数量,还有一个currentFrame=xLayer,用于定义在哪一层中绘制敌人。现在我们有了另一个基本相同的问题,我们想定义一个分数字符串来保存玩家的分数,这取决于他射杀了多少敌人。然而,我也遇到了同样的问题,当我在主类(SpaceImpact.as)中定义ScoreCity时,我希望它显示在主类(currentFrame==7)中,我得到一个错误,说索引超出了边界……如果看不到您使用的代码,就很难提供帮助。不过,对于应用程序的架构来说,除了动画以外的任何东西都使用帧通常不是一个好方法。在您的示例中,
    TIMER\u COMPLETE
    事件永远不会触发非常感谢大家!除了@Batman所说的,你的主要时间线应该是空的——你应该在库中导出符号,并在游戏屏幕之间切换时加载/销毁它们。不要出于任何原因使用场景——在需要时动态构建屏幕,一旦不需要就丢弃。