MMORPG游戏AOI流程

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通知对方自己出现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值