• 3.2 实现AOI格子结构

    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切片。