管理视频游戏中的循环
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 事件仅在显示列表中漫游。内存使用情况?实际上,可以忽略不计,因为删除事件侦听器只会影响一些内部结构几个字节,而任何类型的额外对象都会消耗更多。但是,有许多附加了侦听器的对象 会导致延迟加上内存使用。你在这里每个按钮都有一个,没有代码可以制作多个,所以不要管它们。以上是关于管理视频游戏中的循环的主要内容,如果未能解决你的问题,请参考以下文章