| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package aoiTower
- type (
- Towers map[int32]*Tower // key: tower.id
- // Tower 灯塔对象 - AOI 系统中的网格单元
- Tower struct {
- id int32 // 灯塔的全局唯一标识符
- minX int32 // 灯塔的最小 X 坐标(左边界,包含)
- minY int32 // 灯塔的最小 Y 坐标(上边界,包含)
- maxX int32 // 灯塔的最大 X 坐标(右边界,不包含)
- maxY int32 // 灯塔的最大 Y 坐标(下边界,不包含)
- markers Objects // 灯塔内的被观察者列表(NPC、怪物等)
- watchers Objects // 灯塔内的观察者列表(玩家)
- }
- )
- func (p Towers) Add(tower *Tower) {
- p[tower.id] = tower
- }
- func (p Towers) Adds(addTowers Towers) {
- for _, tower := range addTowers {
- p.Add(tower)
- }
- }
- func (p Towers) Remove(towerID int32) {
- delete(p, towerID)
- }
- func (p Towers) Get(towerID int32) *Tower {
- return p[towerID]
- }
- // Contains 检查指定 ID 的灯塔是否存在于集合中
- // 参数:
- // - towerID: 灯塔的 ID
- //
- // 返回值:灯塔是否存在
- // 用途:快速判断灯塔是否在集合中
- // 性能:O(1) 时间复杂度(map 查询)
- func (p Towers) Contains(towerID int32) bool {
- _, exists := p[towerID]
- return exists
- }
- // Len 返回集合中灯塔的数量
- // 参数:无
- // 返回值:集合中的灯塔数量
- // 用途:获取集合大小
- // 性能:O(1) 时间复杂度
- func (p Towers) Len() int {
- return len(p)
- }
- // Range 遍历集合中的所有灯塔并执行回调函数
- // 参数:
- // - fn: 回调函数,接收灯塔指针作为参数,返回值为 void
- //
- // 返回值:无
- // 用途:对集合中的每个灯塔执行操作
- // 性能:O(n) 时间复杂度,n 为灯塔数量
- // 注意:回调函数不能修改集合结构(添加/删除灯塔)
- func (p Towers) Range(fn func(*Tower)) {
- for _, tower := range p {
- fn(tower)
- }
- }
- // // Markers 获取集合中所有灯塔内的所有被观察者
- // // 参数:无
- // // 返回值:所有灯塔中被观察者的集合
- // // 用途:获取整个视野范围内的所有被观察者
- // // 性能:O(n+m) 时间复杂度,n 为灯塔数量,m 为被观察者总数
- // func (p Towers) Markers() aoi.Objects {
- // makers := aoi.Objects{}
- // for _, tower := range p {
- // makers.Adds(tower.markers)
- // }
- // return makers
- // }
- // // MarkersFilter 获取集合中所有灯塔的被观察者,过滤掉指定的观察者本身
- // // 参数:
- // // - watcher: 观察者对象,用于过滤(避免返回观察者自己)
- // //
- // // 返回值:过滤后的被观察者集合
- // // 用途:当观察者进入时,获取其能看到的所有被观察者(排除自己)
- // // 性能:O(n+m) 时间复杂度,n 为灯塔数量,m 为被观察者总数
- // // 注意:需要检查 watcher 是否真的是观察者,否则返回所有被观察者
- // func (p Towers) MarkersFilter(watcher *aoi.Object) aoi.Objects {
- // makers := aoi.Objects{}
- // if watcher.IsWatcher() {
- // for _, tower := range p {
- // makers.Adds(tower.markers)
- // }
- // }
- // return makers
- // }
- // AddMarker 向灯塔添加被观察者
- // 参数:
- // - object: 被观察者对象(不能为 nil)
- //
- // 返回值:无
- // 用途:将新的被观察者注册到灯塔
- // 性能:O(1) 均摊时间复杂度(如果对象不存在)
- // 注意:如果被观察者已存在则不重复添加
- func (p *Tower) AddMarker(object *Object) {
- if !p.markers.Contains(object.ObjectID) {
- p.markers.Add(object)
- }
- }
- // DelMarker 从灯塔删除被观察者
- // 参数:
- // - object: 要删除的被观察者对象(不能为 nil)
- //
- // 返回值:无
- // 用途:将被观察者从灯塔卸载
- // 性能:O(n) 时间复杂度,n 为被观察者数量
- // 注意:使用对象 ID 进行删除
- func (p *Tower) DelMarker(object *Object) {
- if p.markers.Contains(object.ObjectID) {
- p.markers.Remove(object.ObjectID)
- }
- }
- // AddWatcher 向灯塔添加观察者
- // 参数:
- // - object: 观察者对象(不能为 nil)
- //
- // 返回值:无
- // 用途:将观察者注册到灯塔
- // 性能:O(1) 均摊时间复杂度(如果对象不存在)
- // 注意:如果观察者已存在则不重复添加
- func (p *Tower) AddWatcher(object *Object) {
- if !p.watchers.Contains(object.ObjectID) {
- p.watchers.Add(object)
- }
- }
- // DelWatcher 从灯塔删除观察者
- // 参数:
- // - object: 要删除的观察者对象(不能为 nil)
- //
- // 返回值:无
- // 用途:将观察者从灯塔卸载
- // 性能:O(n) 时间复杂度,n 为观察者数量
- // 注意:使用对象 ID 进行删除
- func (p *Tower) DelWatcher(object *Object) {
- p.watchers.Remove(object.ObjectID)
- }
- // InTower 检查点是否在灯塔范围内
- // 参数:
- // - point: 要检查的场景坐标点
- //
- // 返回值:点是否在灯塔的有效范围内
- // 用途:判断一个场景点是否属于该灯塔
- // 性能:O(1) 时间复杂度
- // 注意:范围是 [minX, maxX) x [minY, maxY)(左闭右开)
- func (p *Tower) InTower(point *Point) bool {
- return point.X >= p.minX && point.X < p.maxX && point.Y >= p.minY && point.Y < p.maxY
- }
- // GetID 获取灯塔ID
- // 返回值:灯塔的唯一标识符
- // 性能:O(1) 时间复杂度
- func (p *Tower) GetID() int32 {
- return p.id
- }
- // GetID 获取灯塔所有观察者
- // 返回值:灯塔所有观察者
- // 性能:O(1) 时间复杂度
- // 注意:调用者不要修改返回的结果
- func (p *Tower) GetWatchers() Objects {
- return p.watchers
- }
- // GetID 获取灯塔被观察者
- // 返回值:灯塔所有被观察者
- // 性能:O(1) 时间复杂度
- // 注意:调用者不要修改返回的结果
- func (p *Tower) GetMarkers() Objects {
- return p.markers
- }
|