我对多人游戏的设计相当陌生,我很难在同步游戏中找到我需要继续的信息(你不能在稍后的时间中断并继续使用类似于壁炉石的游戏),基于转弯的pvp“卡片”游戏。我使用AS3 (flash)作为我的客户端,使用node.js与javascript + mysql进行服务器端处理。
在这个游戏中,牌是由玩家自己创造的。需要注意的是,这些“卡片”是由单个构建块(库swf文件)组装的;数据库跟踪这些卡是如何制作/组装的。因为每个玩家可以有数百张统一制作的卡片,所以我需要一种很好的方式来加载关于pvp战斗或建模/甲板建造的信息。
到目前为止我所取得的成就:
我真正需要回答的问题:
Flash异步加载内容,因此我不知道如何为(有时同时)战斗操作、卡片信息或卡片程序集提出多个数据请求(THere可能是许多卡片和卡片构建块,因此我觉得用单个请求加载所有数据是效率低下的)。我可以让类负责进行这些调用,或者创建一个信使类来处理整个游戏的所有请求/断开/重新连接/消息。
- i could use a ID request system to uniquely identify the socket request
- i could develop a custom event driven system
- I could spawn multiple messenger objects in each class that i need one. <- im leaning towards this option.
编辑:我非常倾向于使用单例XMLSocket包装器或某种扩展类来处理所有的网络事务,因为这在我看来是直观的。我将非常感谢您对通知我的代码的最佳方法的反馈,即信使收到并解析了它所要求的消息(因为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);
}
}发布于 2015-03-11 03:28:15
关于卡片组装--您应该将数据存储在不需要重新计算的数据库中,因此,如果一张卡是由几个“构建块”构建的,您可以将一系列块存储在数据库的一行中,这样,当检索到对手的卡片信息时,您只需select from player_cards where player_id=... and deck_id=...,然后将收集到的数据组装到AS3侧。您绝对不应该把这个负载放在服务器上。
关于异步加载-确保您的PVP握手等待双方成功地处理自己的一方和敌人的卡片。您可以异步加载数据,但是最好在向播放机显示“加载bla”屏幕时执行一个完整的预加载,然后对接收到的数据进行操作。是的,您可以对服务器执行多个请求,也可以在显示“开始战斗”屏幕之前等待所有请求的成功,同时AS3将等待加载完成。但是,关于单个请求和多个请求--我说要尽可能少地执行,因为在初始阶段添加的每一个请求都有可能向单个服务器添加大约1000个请求,并且有可能给服务器端带来太多的压力,从而导致一个自启动的DDoS。确保您的数据库结构允许将数据读取操作简化到客户端,这样您的服务器就不会因为准备数据而承受沉重的负担。但也要确保重复检查任何客户端向服务器报告,因为客户端-服务器游戏的主要规则是“客户端总是谎言”假设。
由于您计划在战斗中使服务器进程玩家操作,您可以在服务器(基于SQL的)或状态对象(基于进程)上创建临时表,这些表将包含当前的游戏状态,这些状态包含与卡所具有的任何能力及其状态(在手、被丢弃、在游戏中、被破坏等)的链接,这样当来自玩家的操作出现时,您可以很容易地验证该卡是否处于A状态,然后切换到B状态,在服务器和客户端执行由此状态更改所导致的任何操作。一旦战斗结束,一定要清理这组数据。这需要对服务器端进行彻底的规划,以便游戏引擎在运行某些操作序列时不会因为过多的SQL请求而使服务器停止运行,例如。
关于消息传递者--也许您应该使用会话方法,以及登录/密码身份验证,这样您就可以使用会话作为密钥来确定这个数据包属于哪一场战斗。我认为AS3端还会定期向服务器发送拉请求,服务器应该快速解析这些请求,并且提交的敌人/服务器操作将尽快返回,这也将确保断开连接将被处理并允许重新连接。
总的来说,问题是非常,并且只能给出提示,甚至不能给出示例。
https://stackoverflow.com/questions/28974070
复制相似问题