用于多人卡/宠物游戏的XMLSocket方法

时间:2015-03-10 21:05:35

标签: actionscript-3 multiplayer flash-cs3 xmlsocket

我对多人游戏设计相当陌生,我很难找到我需要在同步中继续的信息(你不能断开并在以后的时间继续类似于hearthstone),回合制,pvp&#34 ;卡"游戏。我使用AS3(flash)作为我的客户端,使用带有javascript + mysql的node.js进行服务器端处理。

在这个游戏中,牌是由玩家自己创造的。重要的是要注意这些"卡"由各个构建块(库swf文件)组装而成;数据库记录这些卡的制作/组装方式。 因为每个玩家可以有数百张单独制作的牌,所以我需要一个很好的方法来加载关于pvp战斗或修改/甲板建造目的的信息。

到目前为止我所取得的成就:

  • 我已成功将数据发送到服务器,并通过XMLSocket将数据发送回闪存。
  • 我已经成功组装了一张"卡"来自数据库信息。

我真正需要回答的问题是什么:

Flash异步加载内容,因此我不确定如何处理(有时是同步的)战斗行动,卡信息或卡组装的多个数据请求(这可能是很多卡和卡构建块所以我觉得用一个请求加载所有数据效率很低)。我可以让负责的类进行调用或创建一个messenger类来处理整个游戏的所有请求/断开/重新连接/消息。

  • 对于全局信使类方法,我不确定如何通过上游代码从信使检索完全加载的数据(as3继续执行,即使数据不存在)或如何确保请求属于适当的电话

    • 我可以使用ID请求系统来唯一标识套接字请求
    • 我可以开发自定义事件驱动系统
    • 我可以在每个需要一个类的类中生成多个messenger对象。 < - 我倾向于这个选项。
  • 在类似的说明中,也许我应该在游戏开始之前处理卡对象内的数据库请求或预加载所有数据(这将限制我只能动态查询对手牌和战斗数据)。通过每个卡片对象的一次调用方法,我不确定每个播放器的每张卡的#requests是否会压倒我的服务器。 Node.js扩展得非常好,但我没有网络知识来理解单个端口上的所有这些同时请求是否太多。

编辑: 我非常倾向于使用单独的XMLSocket Wrapper或某种类型的扩展类来处理所有网络事务,因为这对我来说似乎很直观。我非常感谢您对通知我的代码的最佳方法的反馈,即信使接收并解析了它所要求的消息(因为即使数据不存在,闪存也将继续执行,我需要一个好方法来执行此操作。)。我读到使用自定义事件并不是那么棒,并且有更好的方法......但这就是我解决问题的方法。

例如我可以做(伪代码)。

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);
    }  
}

1 个答案:

答案 0 :(得分:0)

关于卡片组装 - 您应该将数据存储在不需要重新计算的数据库中,因此如果卡片是由几个"构建块构建的,那么您可以,例如,存储一系列块单行数据库,以便在检索到对手的卡片信息时,只需select from player_cards where player_id=... and deck_id=...然后在AS3端汇编收集的数据。你绝对不应该把这个负载放在服务器上。

关于异步加载 - 确保您的PVP握手等待双方成功处理自己和敌方的牌。您可以异步加载数据,但是在显示"加载bla-bla"时,您最好做一个完整的预加载。屏幕播放器,然后使用接收的数据进行操作。是的,您可以向服务器发出多个请求,是的,您可以在显示" Battle start"之前等待所有这些请求成功。屏幕,在此期间AS3将等待加载完成。但是,关于单个与多个请求 - 我说尽可能少,因为在初始阶段的每个添加的请求都有可能向单个服务器添加一千个左右的请求,并且可能会对您的服务器端,导致自发的DDoS。确保您的数据库结构允许将数据读取操作简化到客户端,以便您的服务器不会因准备数据而负担过重。但是也要确保仔细检查任何客户端向服务器报告的内容,因为客户端 - 服务器游戏的主要规则是"客户端始终在于"假设

由于您计划在战斗中制作服务器进程播放器操作,因此您可以在服务器上创建临时表(基于SQL)或状态对象(基于进程),其中包含当前游戏状态以及指向任何能力的链接这些牌有和他们的状态(在手中,丢弃,在场上,被摧毁等),所以当玩家的动作来时,说"这张牌将状态从A变为B"您可以轻松验证该卡是否处于A状态,然后将其切换到B状态,执行服务器和客户端上此状态更改所导致的任何操作。战斗结束后,请务必清理这组数据。这需要对服务器端进行全面规划,以便在运行某些操作序列时,游戏引擎不会因为SQL请求过多而停止服务器,例如。

关于信使 - 可能您应该使用会话方法,以及登录/密码身份验证,这样您就可以将会话作为密钥来确定此数据包所属的战斗。我想也让AS3方面定期向服务器发送拉取请求,服务器应该快速解析,并尽快返回提交的敌人/服务器动作,这也将确保处理断开连接并允许重新连接。

总体而言,问题是非常广泛,只能提供提示,甚至不是示例。