[英]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”。
為什么這些不是很好:
如果您的應用程序將向其發送更多不同類型的信息,則建議使用AMF編碼。 通過內置的適當壓縮功能,您可以一次發送整個對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.