AOI存在结构

一、观测单位数据结构
PAoiobjRec结构体代表每个可被观察到的单位,存放每个单位的id和句柄

TAoiObjRec = record
 ObjID: Int64;//根据以下两个可以
 hndid: int64;
 hndidx: Integer;
 objkind: byte;end;
 PAoiObjRec = ^TAoiObjRec

二、AOI管理类数据结构
TAoilnfo AOI的类,所有带有视野的生物身上都有此类,管理自身所有视野相关的各种操作,保存视野数据

TAoilnfo = class
 Scribehash: TInt64hash; //我订阅别人–> PAoiObjRec
 Subscribehash: TInt64Hash; //别人订阅我–> PAoiObjRec
 OnDisappear: TOnDisappear; //自身消失时的回调函数
 OnAppear: TOnAppear; //自身出现时的回调函数
 End;

回调函数

对于不同的生物视野内的出现和消失可能需要不同的操作,因此采用回调函数 OnDisappear,OnAppear来实现。
例:对于玩家视野内出现生物或道具时需要通知客户端,对于怪视野内出现生物或道具时不需要任何通知。

订阅关系

1、玩家和玩家之间:可以互相订阅,可以相互被订阅
2、玩家和怪之间:玩家可以订阅怪,怪可以被玩家订阅,怪只能被玩家订阅,不能订阅玩家(因为没有必要,怪如果需要寻找玩家则只需去自身的被订阅列表内寻找即可)
3、怪和怪之间:互相不可订阅,互相不可被订阅

大小格转换

为防止周围坐标格子变化太过频繁,过多更新AOl,因此对周围的坐标格子做了大小格子的转换,把相邻的几个小格子算作一个大格子,玩家移动时若大格子范围没有发生变化,
则无需更新AOI。

执行过程

一、移动(走、跑、瞬移之类)后更新视野范围
二、更新视野范围后如果与原先的视野范围有重叠部分
1、对比自己移动后的视野范围和原先的视野范围,计算出视野范围新增的部分和减少 的部分
2、获取减少的部分的视野对象,移除双方的AOl列表(自己的订阅列表,对方的被
订阅列表,自己的被订阅列表,对方的订阅列表), OnDisappear通知对方自己消失
3、获取增加的部分的视野对象,加入双方的AOl列表(自己的订阅列表,对方的被
订阅列表,自己的被订阅列表,对方的订阅列表), OnAppear通知对方自己出现
三、更新视野范围后如果与原先的视野范围没有重叠部分
1、遍历自己的订阅列表中的所有对象,从他们的被订阅列表中把自己删除
2、清空自己的订阅列表
3、遍历自己的被订阅列表, OnDisappear通知对方自己消失,并从他们的订阅列表中 把自己删除
4、清空自己的被订阅列表
5、计算自己的视野范围,找到视野范围内的所有可见对象
6、根据是否在各自的视野范围内加入双方的AOl列表(自己的订阅列表,对方的被
订阅列表,自己的被订阅列表,对方的订阅列表), OnAppear通知对方自己出现