Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96258
  • 博文数量: 41
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 486
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-18 20:09
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(1)

2014年(9)

2013年(30)

我的朋友

分类: C/C++

2014-02-08 16:30:04

位置同步:一句话概括,就是客户端走动后,发送消息给服务端,服务端广播给周边玩家。

 

 

 

客户端当前所在坐标为x1,y1; 鼠标点击x,y.如下图:


 

 

由客户端的寻路模块计算出路径。

问题: 路径怎么组成

答:也就是说一个曲线怎么组成。 可以由线段来组成。如下图所示:

           

 

 

所以不论什么路径,肯定是由一系列的路径点组成,如(x1,y1); (x2,y2); (x3,y3);。 路径点之间是线段。如x1,y1--x2,y2是直线。

综上,

服务端需要接口, moveto(cur_x, cur_y, target_x, target_y), 两点之间为直线。

 

但是当前点移动到目标点需要时间,而不能瞬移,所以moveto函数的内部实现,应该如下:

moveto函数只是简单记录下实体的当前点和目标点, 标志该实体为可移动。

在帧循环中,遍历场景内的每个实体,如果实体可移动,则根据实体当前速度,重新设 置该实体的新坐标。

移动结束时调用onMoveEnd.(在 server 端,每个 entity 的位置按 10Hz 的频率做离散运动)

 

流程如下:

客户端的寻路模块计算出一系列的路径点(x1,y1); (x2,y2); (x3,y3);,发送给服务端,服务端把所有路径点保存到实体身上,并调用moveto(x1,y1)

当移动结束时,再判断是否还有其余路径点,如x2,y2. 调用moveto(x2,y2). 后面以此类推,直到没有路径点。

 

 

选择:

1,可以在每帧移动的时候广播给周边玩家

2,在要moveto的时候就广播给周边玩家,周边玩家根据速度来模拟。

我倾向于2, 更自然流畅


代码: move@20140218.rar

阅读(667) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

qjzl20082014-02-20 20:45:54

基于这种同步信息量不小啊