我正在尝试制作多人游戏,并且我已经成功制作了服务器和客户端程序。我让客户端通过发送带有" 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);
}
答案 0 :(得分:2)
您可能会发现更好,更有条理地创建将要来回发送的数据的模型/类。 (特别是如果发送大量数据)。然后将整个模型实例序列化为字节数组。
//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);
答案 1 :(得分:1)
如果您只发送该数据," x,y"没关系,但我喜欢更具描述性。喜欢" heroPosXY"会更清楚。如果您担心字符的数量,可以将其缩短到" hpos"。
为什么这些不是很好:
如果您的应用程序将发送更多不同类型的信息,我建议使用AMF编码。这将允许您一次性发送整个对象,内置压缩效果。