簡體   English   中英

用於多人紙牌/寵物游戲的XMLSocket方法

[英]XMLSocket approach for a multiplayer card/pet game

我是多人游戲設計的新手,正在努力尋找繼續同步所需的信息(您不能斷開連接,以后不能像爐石傳說一樣繼續使用),回合制pvp“紙牌”游戲。 我將AS3(flash)用作客戶端,並使用javascript + mysql將node.js用於服務器端處理。

在此游戲中,紙牌由玩家自己創建。 重要的是要注意,這些“卡”是由各個構件(庫swf文件)組裝而成的。 數據庫跟蹤這些卡的制造/組裝方式。 因為每個玩家可以制作數百張獨特制作的紙牌,所以我需要一種很好的方法來按需加載有關這些信息,以進行PVP戰斗或用於改裝/甲板建造。

到目前為止,我已經完成了什么:

  • 我已成功將數據發送到服務器,並通過XMLSocket將數據發送回閃存。
  • 我已經成功地從數據庫信息中組裝了一個“卡”。

我真正需要回答什么問題:

Flash會異步加載內容,因此我不確定如何處理(有時是同時進行的)戰斗動作,卡信息或卡組合(要求可能是很多卡和卡構件)中的多個數據請求單個請求無法加載所有數據)。 我可以讓負責這些調用的類,也可以創建一個Messenger類來處理整個游戲的所有請求/斷開連接/重新連接/消息。

  • 對於全局信使類方法,我不確定如何通過上游代碼從信使中檢索完全加載的數據(即使那里沒有數據,as3也會繼續執行)或如何確保請求與適當的調用有關

    • 我可以使用ID請求系統來唯一標識套接字請求
    • 我可以開發一個定制的事件驅動系統
    • 我可以在需要一個類的每個類中生成多個Messenger對象。 <-我傾向於此選項。
  • 同樣,也許我應該在紙牌對象中處理數據庫請求或在游戲開始之前預加載所有數據(這將使我只能即時查詢對手紙牌和戰斗數據)。 對於每張卡對象一次通話,我不確定每位玩家每張卡的請求數是否會淹沒我的服務器。 Node.js的擴展性很好,但是我沒有網絡知識,無法理解單個端口上的所有這些同時請求是否過多。

編輯:我強烈傾向於使用單例XMLSocket包裝器或某種擴展類來處理所有網絡事務,因為在我看來這很直觀。 非常感謝您對通知我的代碼的最佳方法的反饋,該最佳方法是使Messenger收到並解析它所要求的消息(因為即使數據不存在,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);
    }  
}

關於卡的組裝-您應該將數據存儲在不需要重新計算的數據庫中,因此,如果卡是由多個“構造塊”組成的,則可以例如在一個數據庫行中存儲一系列的塊,以便當檢索到對手的紙牌信息時,您只需select from player_cards where player_id=... and deck_id=... ,然后在AS3一側組合收集的數據即可。 您絕對不應該將此負載放在服務器上。

關於異步加載-確保您的PVP握手等待雙方成功處理雙方和對方的卡。 您可以異步加載數據,但是最好在向播放器顯示“正在加載bla-bla”屏幕時進行完整的預加載,然后對接收到的數據進行操作。 是的,您可以對服務器執行多個請求,是的,您可以等待所有請求成功,然后顯示“爭奪開始”屏幕,同時AS3將等待加載完成。 但是,關於單個請求還是多個請求-我說要盡可能少,因為在初始化階段添加的每個請求都有可能向單個服務器添加一千個左右的請求,並且可能給服務器造成太大的壓力您的服務器端,導致自啟動的DDoS。 確保您的數據庫結構允許直接在客戶端簡化數據讀取操作,以使服務器在准備數據時不會承受沉重的負擔。 但也要確保仔細檢查所有客戶端向服務器報告的內容,因為客戶端-服務器游戲的主要規則是“客戶端始終在說謊”的假設。

由於您計划使服務器進程玩家的戰斗在戰斗中途進行,因此您可以在服務器上創建臨時表(基於SQL)或狀態對象(基於進程),這些臨時表將包含當前游戲狀態並鏈接至卡片具有的所有功能以及它們的狀態(手中,被丟棄,正在玩耍,被破壞等),這樣當玩家采取行動時,說出“此卡的狀態從A更改為B”時,您可以輕松地驗證該卡是否處於A狀態,然后將其切換為B狀態,並在服務器端和客戶端執行此狀態更改引起的任何操作。 戰斗結束后,請確保清理此數據集。 這需要對服務器端進行徹底的計划,以使游戲引擎在運行某些操作序列時不會因例如過多的SQL請求而使服務器停止運行。

關於Messenger-可能應該使用會話方法,以及登錄/密碼身份驗證,通過這種方式,您可以將會話用作密鑰來確定此數據包屬於哪個戰斗。 我認為還可以使AS3端定期向服務器發送請求請求,服務器應迅速對其進行解析,並盡快返回提交的敵人/服務器動作,這也將確保斷開連接得到處理並允許重新連接。

總體而言,這個問題非常廣泛,只能給出提示,甚至不能給出示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM