我试图制作一个小游戏,这需要使用几个"循环"。在我的例子中,用户首先被呈现两个字段和一个" 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是我设计的类,基本上管理连接,每当建立/关闭/删除连接时调度事件。
所以,我有两个问题:
不是我以前用来实现递归的方式吗?意思是,如果有人按哪个连接,断开连接,连接等,它最终是否会导致堆栈溢出? (假设页面上有更多按钮,占用大量内存的东西等)
实现此目的的最佳方法是什么?最后,还会有几个"循环"在游戏中,所以我不确定这是否是一个好的解决方案。游戏开发者常用的是什么?
答案 0 :(得分:1)
不,这不是递归的,因为您正在使用事件而您的侦听器不会相互调用。是的,这是使用事件监听器的正常模型。您甚至可以保留事件侦听器,因为如果对象不在舞台上,它们将不会触发。我唯一要改变的就是分组,也就是说,使用容器Sprite
对象在一个addChild()
中放置一组嵌套的场景,并在必要时加上限制,这样你就不会得到两个屏幕上同时出现不同的场景。
PS:如果您计划从用户接收单行输入,请使用TextField
代替TextArea
。将文本字段类型设置为input
并观看节目。