首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多人卡/宠物游戏的XMLSocket方法

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

Stack Overflow用户
提问于 2015-03-10 21:05:34
回答 1查看 182关注 0票数 0

我对多人游戏的设计相当陌生,我很难在同步游戏中找到我需要继续的信息(你不能在稍后的时间中断并继续使用类似于壁炉石的游戏),基于转弯的pvp“卡片”游戏。我使用AS3 (flash)作为我的客户端,使用node.js与javascript + mysql进行服务器端处理。

在这个游戏中,牌是由玩家自己创造的。需要注意的是,这些“卡片”是由单个构建块(库swf文件)组装的;数据库跟踪这些卡是如何制作/组装的。因为每个玩家可以有数百张统一制作的卡片,所以我需要一种很好的方式来加载关于pvp战斗或建模/甲板建造的信息。

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

  • 我已经成功地将数据发送到服务器,并通过XMLSocket将数据发送回闪存。
  • 我已经成功地从数据库信息中组装了一张“卡片”。

我真正需要回答的问题:

Flash异步加载内容,因此我不知道如何为(有时同时)战斗操作、卡片信息或卡片程序集提出多个数据请求(THere可能是许多卡片和卡片构建块,因此我觉得用单个请求加载所有数据是效率低下的)。我可以让类负责进行这些调用,或者创建一个信使类来处理整个游戏的所有请求/断开/重新连接/消息。

  • 对于全局信使类方法,我不确定如何通过上游代码从信使检索满载数据(as3继续执行,即使没有数据),也不确定如何确保请求与适当的调用相关。
代码语言:javascript
复制
- 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.

  • 类似地,也许我应该处理卡对象中的数据库请求,或者在游戏开始前预先加载所有数据(这将限制我只查询对手牌和动态战斗数据)。使用每卡对象一次调用的方法,我不确定每一位玩家每一张卡的请求是否会压倒我的服务器。Node.js扩展得很好,但是我不知道在单个端口上的所有这些同时请求是否会太多。

编辑:我非常倾向于使用单例XMLSocket包装器或某种扩展类来处理所有的网络事务,因为这在我看来是直观的。我将非常感谢您对通知我的代码的最佳方法的反馈,即信使收到并解析了它所要求的消息(因为flash将继续执行,即使没有数据,我需要一个很好的方法。)我读到使用定制事件并不是很好,而且有更好的方法.但这就是我处理问题的方法。

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

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
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);
    }  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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端还会定期向服务器发送拉请求,服务器应该快速解析这些请求,并且提交的敌人/服务器操作将尽快返回,这也将确保断开连接将被处理并允许重新连接。

总的来说,问题是非常,并且只能给出提示,甚至不能给出示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28974070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档