最近把游戏里面场景aoi实现,做下笔记和记录思路,采用的是九宫格方法,简述下九宫格,每一个格子占一定长宽,九个格子包含整个屏幕(略大于客户端上一个屏幕大小),如下图:
(1,2,3,5,6,7,9,10,11)这九个格子包含一个屏幕,格子6就是角色所在的格子,这样一个角色关心的区域就是这九个格子了。
接着看下,场景中 进入地图,离开地图,移动三种操作的应用:
1. 进入地图,同样上图的例子,角色切换地图进入新地图,(x,y,z)-> 格子6,可以得到当前九宫格的格子序列,(1,2,3,5,6,7,9,10,11),对着9个格子的其他玩家进行广播即可。
2. 离开地图,只是进入地图的相反操作而已,广播角色所在的九宫格中的其他玩家即可。
3. 移动,相对复杂些,我们可以从下图观察,假设从格子6 移动到 格子11,
很容易想到,会伴随 一些玩家离开“我”视野,一些玩家看见“我”在移动,一些玩家进入“我”的视野。其实只是两个九宫格序列的交集,差集问题(x:表示交集运算,-:表示差集运算)。
(1,2,3,5,6,7,9,10,11)x (6,7,8,10,11,12,14,15,16) = (6,7,10,11)
(1,2,3,5,6,7,9,10,11)- (6,7,8,10,11,12,14,15,16) = (1,2,3,5,9)
(6,7,8,10,11,12,14,15,16) - (1,2,3,5,6,7,9,10,11) =(8,12,16,15,14)
即:
(6,7,10,11)格子序列中的玩家看见“我”在移动
(1,2,3,5,6)格子序列中的玩家离开“我”的视野
(8,12,16,15,14)格子序列中的玩家进入“我”的视野
接着,可以在九宫格的基础上再进一步优化,当角色进入一个新的格子,可以维护着两个list:ied_list,i_list
ied_list: 记录那些玩家关心“我”的操作。
i_list: 记录“我”关心了哪些玩家,他们在“我”的视野里面。
怎么衡量两个玩家之间的这种关系呢?我是通过计算两个玩家之间的关系权重,配合玩家之间的距离。例如:初始化两个没有任何关系的玩家权重是init_val=1000,距离是dist_val,那么他们之间权重weight=init_val-dist_val,这样就可以做到集合的聚拢了,视野可以尽可能的靠近玩家自己,并且可以自己添加其它因素,例如在同一个队伍的玩家,weight = init_val-dist_val+team_val,简单的加减法可以做到集合自然的聚拢。
原文
链接
阅读(4021) | 评论(0) | 转发(0) |