tower.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package aoiTower
  2. type (
  3. Towers map[int32]*Tower // key: tower.id
  4. // Tower 灯塔对象 - AOI 系统中的网格单元
  5. Tower struct {
  6. id int32 // 灯塔的全局唯一标识符
  7. minX int32 // 灯塔的最小 X 坐标(左边界,包含)
  8. minY int32 // 灯塔的最小 Y 坐标(上边界,包含)
  9. maxX int32 // 灯塔的最大 X 坐标(右边界,不包含)
  10. maxY int32 // 灯塔的最大 Y 坐标(下边界,不包含)
  11. markers Objects // 灯塔内的被观察者列表(NPC、怪物等)
  12. watchers Objects // 灯塔内的观察者列表(玩家)
  13. }
  14. )
  15. func (p Towers) Add(tower *Tower) {
  16. p[tower.id] = tower
  17. }
  18. func (p Towers) Adds(addTowers Towers) {
  19. for _, tower := range addTowers {
  20. p.Add(tower)
  21. }
  22. }
  23. func (p Towers) Remove(towerID int32) {
  24. delete(p, towerID)
  25. }
  26. func (p Towers) Get(towerID int32) *Tower {
  27. return p[towerID]
  28. }
  29. // Contains 检查指定 ID 的灯塔是否存在于集合中
  30. // 参数:
  31. // - towerID: 灯塔的 ID
  32. //
  33. // 返回值:灯塔是否存在
  34. // 用途:快速判断灯塔是否在集合中
  35. // 性能:O(1) 时间复杂度(map 查询)
  36. func (p Towers) Contains(towerID int32) bool {
  37. _, exists := p[towerID]
  38. return exists
  39. }
  40. // Len 返回集合中灯塔的数量
  41. // 参数:无
  42. // 返回值:集合中的灯塔数量
  43. // 用途:获取集合大小
  44. // 性能:O(1) 时间复杂度
  45. func (p Towers) Len() int {
  46. return len(p)
  47. }
  48. // Range 遍历集合中的所有灯塔并执行回调函数
  49. // 参数:
  50. // - fn: 回调函数,接收灯塔指针作为参数,返回值为 void
  51. //
  52. // 返回值:无
  53. // 用途:对集合中的每个灯塔执行操作
  54. // 性能:O(n) 时间复杂度,n 为灯塔数量
  55. // 注意:回调函数不能修改集合结构(添加/删除灯塔)
  56. func (p Towers) Range(fn func(*Tower)) {
  57. for _, tower := range p {
  58. fn(tower)
  59. }
  60. }
  61. // // Markers 获取集合中所有灯塔内的所有被观察者
  62. // // 参数:无
  63. // // 返回值:所有灯塔中被观察者的集合
  64. // // 用途:获取整个视野范围内的所有被观察者
  65. // // 性能:O(n+m) 时间复杂度,n 为灯塔数量,m 为被观察者总数
  66. // func (p Towers) Markers() aoi.Objects {
  67. // makers := aoi.Objects{}
  68. // for _, tower := range p {
  69. // makers.Adds(tower.markers)
  70. // }
  71. // return makers
  72. // }
  73. // // MarkersFilter 获取集合中所有灯塔的被观察者,过滤掉指定的观察者本身
  74. // // 参数:
  75. // // - watcher: 观察者对象,用于过滤(避免返回观察者自己)
  76. // //
  77. // // 返回值:过滤后的被观察者集合
  78. // // 用途:当观察者进入时,获取其能看到的所有被观察者(排除自己)
  79. // // 性能:O(n+m) 时间复杂度,n 为灯塔数量,m 为被观察者总数
  80. // // 注意:需要检查 watcher 是否真的是观察者,否则返回所有被观察者
  81. // func (p Towers) MarkersFilter(watcher *aoi.Object) aoi.Objects {
  82. // makers := aoi.Objects{}
  83. // if watcher.IsWatcher() {
  84. // for _, tower := range p {
  85. // makers.Adds(tower.markers)
  86. // }
  87. // }
  88. // return makers
  89. // }
  90. // AddMarker 向灯塔添加被观察者
  91. // 参数:
  92. // - object: 被观察者对象(不能为 nil)
  93. //
  94. // 返回值:无
  95. // 用途:将新的被观察者注册到灯塔
  96. // 性能:O(1) 均摊时间复杂度(如果对象不存在)
  97. // 注意:如果被观察者已存在则不重复添加
  98. func (p *Tower) AddMarker(object *Object) {
  99. if !p.markers.Contains(object.ObjectID) {
  100. p.markers.Add(object)
  101. }
  102. }
  103. // DelMarker 从灯塔删除被观察者
  104. // 参数:
  105. // - object: 要删除的被观察者对象(不能为 nil)
  106. //
  107. // 返回值:无
  108. // 用途:将被观察者从灯塔卸载
  109. // 性能:O(n) 时间复杂度,n 为被观察者数量
  110. // 注意:使用对象 ID 进行删除
  111. func (p *Tower) DelMarker(object *Object) {
  112. if p.markers.Contains(object.ObjectID) {
  113. p.markers.Remove(object.ObjectID)
  114. }
  115. }
  116. // AddWatcher 向灯塔添加观察者
  117. // 参数:
  118. // - object: 观察者对象(不能为 nil)
  119. //
  120. // 返回值:无
  121. // 用途:将观察者注册到灯塔
  122. // 性能:O(1) 均摊时间复杂度(如果对象不存在)
  123. // 注意:如果观察者已存在则不重复添加
  124. func (p *Tower) AddWatcher(object *Object) {
  125. if !p.watchers.Contains(object.ObjectID) {
  126. p.watchers.Add(object)
  127. }
  128. }
  129. // DelWatcher 从灯塔删除观察者
  130. // 参数:
  131. // - object: 要删除的观察者对象(不能为 nil)
  132. //
  133. // 返回值:无
  134. // 用途:将观察者从灯塔卸载
  135. // 性能:O(n) 时间复杂度,n 为观察者数量
  136. // 注意:使用对象 ID 进行删除
  137. func (p *Tower) DelWatcher(object *Object) {
  138. p.watchers.Remove(object.ObjectID)
  139. }
  140. // InTower 检查点是否在灯塔范围内
  141. // 参数:
  142. // - point: 要检查的场景坐标点
  143. //
  144. // 返回值:点是否在灯塔的有效范围内
  145. // 用途:判断一个场景点是否属于该灯塔
  146. // 性能:O(1) 时间复杂度
  147. // 注意:范围是 [minX, maxX) x [minY, maxY)(左闭右开)
  148. func (p *Tower) InTower(point *Point) bool {
  149. return point.X >= p.minX && point.X < p.maxX && point.Y >= p.minY && point.Y < p.maxY
  150. }
  151. // GetID 获取灯塔ID
  152. // 返回值:灯塔的唯一标识符
  153. // 性能:O(1) 时间复杂度
  154. func (p *Tower) GetID() int32 {
  155. return p.id
  156. }
  157. // GetID 获取灯塔所有观察者
  158. // 返回值:灯塔所有观察者
  159. // 性能:O(1) 时间复杂度
  160. // 注意:调用者不要修改返回的结果
  161. func (p *Tower) GetWatchers() Objects {
  162. return p.watchers
  163. }
  164. // GetID 获取灯塔被观察者
  165. // 返回值:灯塔所有被观察者
  166. // 性能:O(1) 时间复杂度
  167. // 注意:调用者不要修改返回的结果
  168. func (p *Tower) GetMarkers() Objects {
  169. return p.markers
  170. }