管理视频游戏中的循环
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 就调度事件。
那么,我有两个问题:
我以前实现这个递归的方式不对吗?意思是,如果有人在哪里按连接、断开连接、连接等,最终会导致堆栈溢出吗? (假设页面上有更多按钮,占用大量内存等)
实现这个的最佳方法是什么?最后,游戏中还会有几个"loops",所以我不确定这是否是一个好的解决方案。游戏开发者常用什么?
不,这不是递归的,因为您正在使用事件并且您的侦听器不会相互调用。是的,这是使用事件侦听器的正常模型。您甚至可以保留事件侦听器,因为如果对象不在舞台上,它们将不会触发。我唯一要改变的是分组,即使用容器 Sprite
对象将一组嵌套的风景放在一个 addChild()
中,并在必要时进行限制,这样你就不会得到两个一次在屏幕上显示不同的场景。
PS:如果您计划让它们接收用户的单行输入,请使用 TextField
而不是 TextArea
。将文本字段类型设置为 input
并观看节目。
我正在尝试制作一款小游戏,这需要使用多个 "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 就调度事件。
那么,我有两个问题:
我以前实现这个递归的方式不对吗?意思是,如果有人在哪里按连接、断开连接、连接等,最终会导致堆栈溢出吗? (假设页面上有更多按钮,占用大量内存等)
实现这个的最佳方法是什么?最后,游戏中还会有几个"loops",所以我不确定这是否是一个好的解决方案。游戏开发者常用什么?
不,这不是递归的,因为您正在使用事件并且您的侦听器不会相互调用。是的,这是使用事件侦听器的正常模型。您甚至可以保留事件侦听器,因为如果对象不在舞台上,它们将不会触发。我唯一要改变的是分组,即使用容器 Sprite
对象将一组嵌套的风景放在一个 addChild()
中,并在必要时进行限制,这样你就不会得到两个一次在屏幕上显示不同的场景。
PS:如果您计划让它们接收用户的单行输入,请使用 TextField
而不是 TextArea
。将文本字段类型设置为 input
并观看节目。