我对多人游戏设计相当陌生,并且正在努力寻找我需要在我的同步游戏中继续的信息(你不能断开连接并在以后继续,类似于炉石),基于回合的 pvp“纸牌”游戏。我使用 AS3 (flash) 作为客户端,使用 node.js 和 javascript + mysql 进行服务器端处理。
在这个游戏中,卡片是由玩家自己创建的。需要注意的是,这些“卡片”是由单独的构建块(库 swf 文件)组装而成的;数据库跟踪这些卡片是如何制作/组装的。因为每个玩家可能有数百张独一无二的卡片,所以我需要一种很好的方法来按需加载有关这些卡片的信息,以用于 pvp 战斗或改装/套牌构建目的。
到目前为止我已经完成了什么:
- 我已成功将数据发送到服务器并通过 XMLSocket 将数据发送回闪存。
- 我已经成功地从数据库信息中组装了一张“卡片”。
我真正需要回答的问题是:
Flash 异步加载内容,所以我不确定如何为(有时同时)战斗动作、卡片信息或卡片组合发出多个数据请求(可能有很多卡片和卡片构建块,所以我觉得会是使用单个请求加载所有数据效率低下)。我可以让负责进行这些调用的类或创建一个信使类来处理整个游戏的所有请求/断开/重新连接/消息。
对于全局信使类方法,我不确定如何通过上游代码从信使中检索完全加载的数据(即使数据不存在,as3 也会继续执行)或如何确保请求与适当的调用有关
- 我可以使用 ID 请求系统来唯一标识套接字请求
- 我可以开发一个自定义的事件驱动系统
- 我可以在我需要的每个类中生成多个信使对象。<-我倾向于这个选项。
类似地,也许我应该在卡片对象中处理数据库请求或在游戏开始之前预加载所有数据(这将限制我只能即时查询对手卡片和战斗数据)。使用每卡对象一次调用的方法,我不确定每个玩家每张卡的#requests 是否会压倒我的服务器。Node.js 的扩展性很好,但我没有网络知识来了解单个端口上的所有这些同时请求是否太多。
编辑:我强烈倾向于使用单例 XMLSocket Wrapper 或某种扩展类来处理所有网络事务,因为这对我来说似乎很直观。我非常感谢您对通知我的代码的最佳方法的反馈,信使收到并解析了它要求的消息(因为即使数据不存在,flash 也会继续执行,我需要一个好的方法来做到这一点。)。我读到使用自定义事件并不是那么好,还有更好的方法......但这就是我解决问题的方式。
例如我可以做(伪代码)。
m:Messenger = new Messenger(); //this is my wrapper
m.addEventListener(new CustomEvent(CustomEvent.EVENTSTRING, parseData));
m.sendData(DataObject); //calls
function parseData(e:CustomEvent) {
xml(e.data);
}
import flash.net.XMLSocket;
import globals.*;
public class Messenger
{
public static var _Socket:XMLSocket;
public var xml:XML;
public function Messenger()
{
_Socket = new XMLSocket(vars._Server, vars._Port);
_Socket.addEventListener(Event.CONNECT, onConnect);
_Socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
}
private function onConnect(evt:Event):void {
trace("Connected");
_Socket.removeEventListener(Event.CONNECT, onConnect);
_Socket.removeEventListener(IOErrorEvent.IO_ERROR, onError);
_Socket.addEventListener(DataEvent.DATA, onDataReceived);
_Socket.addEventListener(Event.CLOSE, onSocketClose);
}
private function onDataReceived(evt:DataEvent):void {
//trigger correct event here based on data identifier w/ dispatchEvent(EVENTSTRING);
}
}