3.2 实现AOI格子结构

将aoi模块放在一个core模块中

mmo_game/core/grid.go

  1. package core
  2. import "sync"
  3. /*
  4. 一个地图中的格子类
  5. */
  6. type Grid struct {
  7. GID int //格子ID
  8. MinX int //格子左边界坐标
  9. MaxX int //格子右边界坐标
  10. MinY int //格子上边界坐标
  11. MaxY int //格子下边界坐标
  12. playerIDs map[int]bool //当前格子内的玩家或者物体成员ID
  13. pIDLock sync.RWMutex //playerIDs的保护map的锁
  14. }
  15. //初始化一个格子
  16. func NewGrid(gID, minX, maxX, minY, maxY int) *Grid {
  17. return &Grid{
  18. GID:gID,
  19. MinX:minX,
  20. MaxX:maxX,
  21. MinY:minY,
  22. MaxY:maxY,
  23. playerIDs:make(map[int] bool),
  24. }
  25. }
  26. //向当前格子中添加一个玩家
  27. func (g *Grid) Add(playerID int) {
  28. g.pIDLock.Lock()
  29. defer g.pIDLock.Unlock()
  30. g.playerIDs[playerID] = true
  31. }
  32. //从格子中删除一个玩家
  33. func (g *Grid) Remove(playerID int) {
  34. g.pIDLock.Lock()
  35. defer g.pIDLock.Unlock()
  36. delete(g.playerIDs, playerID)
  37. }
  38. //得到当前格子中所有的玩家
  39. func (g *Grid) GetPlyerIDs() (playerIDs []int) {
  40. g.pIDLock.RLock()
  41. defer g.pIDLock.RUnlock()
  42. for k, _ := range g.playerIDs {
  43. playerIDs = append(playerIDs, k)
  44. }
  45. return
  46. }
  47. //打印信息方法
  48. func (g *Grid) String() string {
  49. return fmt.Sprintf("Grid id: %d, minX:%d, maxX:%d, minY:%d, maxY:%d, playerIDs:%v",
  50. g.GID, g.MinX, g.MaxX, g.MinY, g.MaxY, g.playerIDs)

Grid这个格子类型,很好理解,分别有上下左右四个坐标,确定格子的领域范围,还是有格子ID,其中playerIDs是一个map,表示当前格子中存在的玩家有哪些。这里提供了一个方法GetPlyerIDs()可以返回当前格子中所有玩家的ID切片。