管理视频游戏中的循环

Posted

技术标签:

【中文标题】管理视频游戏中的循环【英文标题】:Managing loops in a video game 【发布时间】:2015-05-29 21:58:46 【问题描述】:

我正在尝试制作一个小游戏,这需要使用几个“循环”。在我的例子中,首先向用户展示了两个字段和一个“连接”按钮。一旦他点击按钮,字段和按钮就会被移除,游戏会移动到另一个包含一个“断开连接”按钮的屏幕,这会将他再次带到第一个屏幕。这是我的幼稚实现(我简化了很多):

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】:

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

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

【讨论】:

谢谢!我喜欢使用Sprite 对象的想法。如何使它们包含多个对象?我也在使用TextField,但如果我没记错的话,我在对它们应用TextFormat 时遇到了问题。我得调查一下。 您创建一个Sprite,然后使用您希望它包含的任何对象调用它的addChild()Sprite 就像一个盒子,放在舞台上就可以打开。 var menu:Sprite=new Sprite(); menu.addChild(newGameButton); menu.addChild(loadGameButton); ...etc addChild(menu); 您还可以移动、旋转或缩放整个 sprite 而无需其内容来更改它们的相对位置,这有时很有用。如果您打算这样做,那么您必须将精灵的内容放置在相对于该精灵的转折点(锚点, (0,0) )的坐标上,这样您就不需要设计自定义旋转,并且精灵应该正确放置在屏幕上,以便其全部内容可见(或您希望可见的部分可见)。 即使对象不在舞台上,保留事件侦听器是否会导致额外的延迟/内存使用? 滞后?不,因为当对象不在显示列表中时,不会检查它是否具有任何鼠标、键盘或框架事件的事件侦听器。 UI 事件仅在显示列表中漫游。内存使用情况?实际上,可以忽略不计,因为删除事件侦听器只会影响一些内部结构几个字节,而任何类型的额外对象都会消耗更多。但是,有许多附加了侦听器的对象 会导致延迟加上内存使用。你在这里每个按钮都有一个,没有代码可以制作多个,所以不要管它们。

以上是关于管理视频游戏中的循环的主要内容,如果未能解决你的问题,请参考以下文章

视频Steam3A大作《死亡循环》!steam最绿的游戏:老婆我回来了

如何同步自动播放/循环中的两个 HTML 视频元素?

视频游戏中的对象关系映射

循环播放本地目录中的所有视频

利用函数计算实现网络游戏或视频直播中的敏感词检测

ffmpeg # 画中画中的视频进行循环