管理视频游戏中的循环

Managing loops in a video game

我正在尝试制作一款小游戏,这需要使用多个 "loops"。在我的例子中,用户首先看到两个字段和一个 "Connect" 按钮。一旦他单击该按钮,字段和按钮将被删除,游戏将移动到另一个包含单个 "disconnect" 按钮的屏幕,这将再次将他带到第一个屏幕。这是我天真的实现(我简化了很多):

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 是我设计的 class,它基本上管理连接,只要连接 established/closed/dropped 就调度事件。

那么,我有两个问题:

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

PS:如果您计划让它们接收用户的单行输入,请使用 TextField 而不是 TextArea。将文本字段类型设置为 input 并观看节目。