Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4997316
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: 架构设计与优化

2016-03-04 12:42:30

最近把游戏里面场景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,简单的加减法可以做到集合自然的聚拢。

原文链接

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