登录 |

MMOG同步x/y坐标压缩方法

2011年06月13日 上午 42:43 | 作者:

实现一个捕鱼达人同屏游戏,server将鱼的x/y坐标发送到client上

1、数据结构第一版,13byte
鱼类型ID(type_id): 0~11

主键ID(id) :0+

x/y坐标:含符号小数

[type_id,id,x,y]

数据结构:[byte(8),short(16),float(32),float(32)]

2、x/y坐标不用精确到小数点后xxx位!7byte

屏幕尺寸是(800×460)

坐标保留小数点后1位即可,将浮点小数转换成整数!

例如:[100.98839990023,98.839990023]

100.9883990023 × 10 => 1009.88399002

Math.round(1009.883990023) => 1010

[1010,988]

=>

[1010/10,988/10] = [101.0,98.8]

数据结构:[byte(8),short(16),short(16),short(16)]

3、需要知道type_id/id吗?

3.1 消除id

每种鱼的数量不会超过100,头部说明每种鱼的数量,将xy数据order by按type_id和id,就不用重复type_id/id数据了!

[length0,…,length11]{data0:[x1,y2],[x2,y2]}{data1:[x1,y2],[x2,y2]}…{data11:[x1,y2],[x2,y2]}

数据结构:[byte(8)*12][short(16),short(16)]*N

3.2 原来type_id我也不用知道!将数据直接按鱼的唯一id排序!

[x1,y1],[x2,y2],…,[x999,y999]

数据结构:[short(16),short(16)]*N

问题就是服务端的鱼列表和客户端的列表一定要保持一致,如果服务端删除了实体而客户端没有删除,就无法同步了。

同步xy坐标的压缩算法就是这两种了,最后的方案,只剩下x/y数据了,The END。

php flash socket policy server

2011年06月9日 下午 38:31 | 作者:

usage: php [policy.php]
 
$xml = '<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/
xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain
="*" to-ports="*" /></cross-domain-policy>';

$policy = $xml."\0";
$socket = socket_create_listen(843);
while(1) {
    if(($client = socket_accept($socket)) !== false) {
        socket_write($client, $policy);
        socket_close($client);
    }
}