MMO碰撞检测,战斗,地图行走以及寻路问题

1. 碰撞检测

碰撞应该在服务端做,否则客户端就可以作弊了,但是服务端没有场景的几何信息,怎么做碰撞呢,方法是使用一张碰撞图,可以由美术生成,把接受碰撞的物体绘制成黑色,其他地方绘制成白色,对于边界和通道可以由美工在上面手动刷。

碰撞图生成之后,当客户端请求行走的时候,根据当前x, z位置和下一个x, z位置,可以计算出在碰撞图中的相应坐标,然后判断它们之间是否有黑色的像素,进而判断出是否会碰撞,然后给客户端作出响应。

2. 地图行走: 即如何保证人物行走时总是在地形的上方

保证人物在地形上方的方法是向-y方向投射一条射线,进而计算出人物当前位置的y坐标,然后更新人物的位置。这种计算最好在客户端做,因为服务器不能保存地形信息,但这样有一个问题,客户端可以提供假的y坐标,这样可能会造成问题,解决办法是,在服务端为每个地图保存一张y坐标图,它可以是不太精确的,用来防止客户端作弊。

对于那种可以掉下去的地图,可以在服务端模拟这种简单的物理,即给角色一个初速度,然后受重力作用。y坐标是逐步更新的。

3. 关于战斗

物理攻击: 当客户端请求物理攻击时,根据角色的位置和朝向判断与攻击目标的距离,若距离在攻击范围内,则允许攻击,服务端通知客户端播放攻击动画,当播放到某个点时【打到目标身上时】,通知服务端,服务端修改相应的状态,同步到客户端。

魔法攻击: 对于可穿墙的魔法,只需判断攻击者与目标的距离即可;不可穿墙的魔法,则需要使用碰撞图判断中间是否有障碍物,进而确定攻击是否有效。若有效,则通知客户端播放魔法动画,当技能打到目标身上时,通知服务端,服务端修改状态并同步到客户端。

4. 关于寻路

仅在服务端寻路:服务端根据碰撞图生成路线,然后更新位置同步到客户端。这种方式寻路有点耗!毕竟寻路也是一个经常用的功能,而且有那么多客户端,怕服务端吃不消。

服务端和客户端配合寻路:客户端生成路线,服务端监督客户端的移动,感觉这种方式比较好:)。

猜你喜欢

转载自blog.csdn.net/janker5/article/details/83151306
今日推荐