管理视频游戏中的循环

时间:2015-03-26 00:32:12

标签: actionscript-3 flash loops events actionscript

我试图制作一个小游戏,这需要使用几个"循环"。在我的例子中,用户首先被呈现两个字段和一个" Connect"按钮。一旦他点击按钮,就会删除字段和按钮,然后游戏会移动到另一个屏幕,该屏幕包含一个单独的"断开"按钮,再次将他带到第一个屏幕。这是我天真的实现(我简化了很多):

package Application {
    import flash.display.Sprite;
    import flash.events.Event;
    import fl.controls.TextArea;
    import fl.controls.Button;
    import flash.events.MouseEvent;
    public class Main extends Sprite {
        var IPField:TextArea;
        var PortField:TextArea;
        var disconnectButton:Button;
        var nickField:TextArea;
        var passField:TextArea;
        var loginButton:Button;
        var network:NetworkHandler;

        public function Main() {
            IPField = new TextArea();
            PortField = new TextArea();
            disconnectButton = new Button();

            // Snipped : positioning the Buttons and TextAreas

            network = new NetworkHandler(this.stage, IPField, PortField);
            network.addEventListener("connection_opened", onConnect);
            network.addEventListener("connection_error", onError);
            disconnectButton.addEventListener(MouseEvent.CLICK, network.doConnect);

            addChild(IPField);
            addChild(PortField);
            addChild(disconnectButton);
        }

        private function onConnect(e:Event):void {
            removeChild(IPField);
            removeChild(PortField);
            removeChild(disconnectButton);
            disconnectButton.removeEventListener(MouseEvent.CLICK, network.doConnect);
            network.removeEventListener("connection_opened", onConnect);
            network.removeEventListener("connection_error", onError);

            network.addEventListener("connection_closed", returnToConnect);
            network.addEventListener("connection_error", returnToConnect);
            disconnectButton.addEventListener(MouseEvent.CLICK, network.doDisconnect);
            addChild(disconnectButton);
        }

        private function returnToConnect(e:Event):void {
            loginButton.removeEventListener(MouseEvent.CLICK,network.doConnect);
            removeChild(disconnectButton);
            network.removeEventListener("connection_closed", returnToConnect);
            network.removeEventListener("connection_error", returnToConnect);

            disconnectButton.addEventListener(MouseEvent.CLICK, network.doConnect);
            network.addEventListener("connection_opened", onConnect);
            network.addEventListener("connection_error", onError);
            addChild(IPField);
            addChild(PortField);
            addChild(disconnectButton);
        }

        private function onError(e:Event):void {
            // Error management
        }
    }
}

对于记录,NetworkManager是我设计的类,基本上管理连接,每当建立/关闭/删除连接时调度事件。

所以,我有两个问题:

  • 不是我以前用来实现递归的方式吗?意思是,如果有人按哪个连接,断开连接,连接等,它最终是否会导致堆栈溢出? (假设页面上有更多按钮,占用大量内存的东西等)

  • 实现此目的的最佳方法是什么?最后,还会有几个"循环"在游戏中,所以我不确定这是否是一个好的解决方案。游戏开发者常用的是什么?

1 个答案:

答案 0 :(得分:1)

不,这不是递归的,因为您正在使用事件而您的侦听器不会相互调用。是的,这是使用事件监听器的正常模型。您甚至可以保留事件侦听器,因为如果对象不在舞台上,它们将不会触发。我唯一要改变的就是分组,也就是说,使用容器Sprite对象在一个addChild()中放置一组嵌套的场景,并在必要时加上限制,这样你就不会得到两个屏幕上同时出现不同的场景。

PS:如果您计划从用户接收单行输入,请使用TextField代替TextArea。将文本字段类型设置为input并观看节目。