分类: 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, 更自然流畅