簡體   English   中英

AS3 AIR在多人游戲中發送數據的正確方法

[英]AS3 AIR Correct way of sending data in multiplayer game

我正在嘗試制作多人游戲,並且已經成功制作了服務器和客戶端程序。 我已經讓客戶發送帶有“ x,y”的字符串來發送客戶英雄的x和y位置。 有沒有更好的數據發送方式?

編輯:

玩家是玩家控制的精靈。 player2是另一個玩家的模擬。

服務器代碼(用於接收):

private function inComingDataHandler(e:DatagramSocketDataEvent):void
    {
        textField.text = "Connected to: " + e.srcAddress;
        targetIP = e.srcAddress;
        var coordinates:Array = e.data.readUTFBytes(e.data.bytesAvailable).split(",");
        player2.x = Number(coordinates[0]);
        player2.y = Number(coordinates[1]);
        coordinates.splice(0, 1);
        coordinates.splice(1, 1);
    }

客戶代碼(用於發送):

private function sendData():void
    {
        var data:ByteArray = new ByteArray();
        data.writeUTFBytes(String(player.x + "," + player.y));

        dataGramSocket.send(data, 0, 0, targetIP, targetPort);
    }

您可能會發現更好和更有條理地創建要來回發送的數據的模型/類。 (尤其是在發送大量數據時)。 然后將整個模型實例序列化為字節數組。

//Create a model for the data that needs to be passed back and forth

package {
    import flash.utils.Dictionary;
    import flash.geom.Point;

    public class ServerData {
        public function ServerData():void {}

        public var coordinates:Point; //your coordinates
        public var someOtherVariable:MyCustomClass;
        public var someOtherVar:Dictionary;
    }
}

然后,將模型序列化為字節數組:

private function sendData():void {
    var data:ServerData = new ServerData();  //make an instance of your class above
    data.coordinates = new Point(player.x,player.y);
    var ba:ByteArray = new ByteArray();
    ba.writeObject(data); //this serializes your object/model

    dataGramSocket.send(ba, 0, 0, targetIP, targetPort);
}

然后,將其讀回:

private function inComingDataHandler(e:DatagramSocketDataEvent):void {
    e.data.position = 0;
    var data:ServerData = e.data.readObject() as ServerData;

    player2.x = data.coordinates.x;
    player2.y = data.coordinates.y;

最后(非常重要),您必須注冊計划存儲在序列化字節數組中的任何非原始類(需要導入的類)(這包括其他類中的嵌套類)。 在構造函數中或實際上在任何地方,請執行以下操作:

flash.net.registerClassAlias("flash.geom.Point", Point);
flash.net.registerClassAlias("com.myCustomClass", MyCustomClass);
flash.net.registerClassAlias("flash.utils.Dictionary", Dictionary);

如果您僅發送數據,則“ x,y”是可以的,但我希望更具描述性。 像“ heroPosXY”這樣的東西會更清晰。 如果您擔心字符數,可以將其縮短到“ hpos”。

為什么這些不是很好:

  • “ x,y”-任何東西都可以是二維位置。 不具描述性
  • “ hp”-可能是“ hero position”的簡寫,但有人會認為“ hit points”

如果您的應用程序將向其發送更多不同類型的信息,則建議使用AMF編碼。 通過內置的適當壓縮功能,您可以一次發送整個對象。

暫無
暫無

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

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