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 }