1. 客户端地图格子的相关知识
在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端至少会有三个坐标系:
a) 3D坐标系:所有需要3D渲染的角色和光效,都以3D坐标系中定位。
b) 2D坐标系:用来定位和绘制固定的2D地图元素,比如草皮、马路等。
c) 2D坐标系里的格子坐标系:用来实现打掩码、自动寻路和定位2D地图上交互层里2D元素的坐标:比如树、房子的位置,NPC和怪物初始的位置。用格子坐标来定位更方便直观,当地图上显示有格子坐标时,一眼就能看出某个格子坐标在哪,如果是使用2D坐标系的坐标,则位置较难找到。
端游使用的格子大小一般为(64, 32),手游的精确度要求低一些,我们用的是(100, 50),即2D坐标系里长为100宽为50的矩形,即是格子坐标系里的一个坐标。示例图如下:
我们采用的方式,是同步状态的变化,然后由客户端来触发服务器对大格子跨越的判断:
a) 当玩家点击地图上某个地方,或者改变了摇杆方向,玩家的运行状态就变化了,即向某个坐标点移动。状态变化的时候,客户端就立即给服务器发消息,然后服务器进行转发。这样如果忽略了网络的延迟,那这个角色在所有客户端上,几乎是同时开始移动。
b) 如何判断角色的移动过程中跨越了同步大格子,有的游戏里采用服务器判断的方式,即根据角色的移动速度和方向,计算出跨越的时刻,然后使用一个Timer来触发。同时如果服务器要取这个角色的当前位置,则需要通知运动公式来进行计算。这个方案相对精确一些,但比较复杂,服务器也需要为每一个移动的角色设定一个Timer,对服务器的性能有所消耗。
c) 精英怪和BOSS怪的AI
精英怪和BOSS怪由于数量较少,而且比较重要,所以不能由客户端来申请AI控制权,而是服务器根据某种策略来控制。所使用的策略可以考虑角色的伤害值、防御值、角色与BOSS的距离远近等,根据这些因素,服务器计算出BOSS怪当前最适合攻击的对象(比如血量最少的玩家,最脆弱的法师等),然后将AI控制权发给那个客户端,由那个客户端控制攻击行为,同时通过消息让服务器同步给其他玩家。