AS3 AIR在多人游戏中正确发送数据的方式

时间:2014-12-28 17:15:17

标签: actionscript-3 flash networking air

我正在尝试制作多人游戏,并且我已经成功制作了服务器和客户端程序。我让客户端通过发送带有" 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);
    }

2 个答案:

答案 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"。

为什么这些不是很好:

  • " X,Y" - 这可能是任何事物的二维位置。不 描述
  • " HP" - 可以是"英雄位置"的缩写,但只有一个 可以思考"点数"

如果您的应用程序将发送更多不同类型的信息,我建议使用AMF编码。这将允许您一次性发送整个对象,内置压缩效果。