3.2 实现AOI格子结构

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

mmo_game/core/grid.go

package core

import "sync"

/*
    一个地图中的格子类
*/
type Grid struct {
    GID       int          //格子ID
    MinX      int          //格子左边界坐标
    MaxX      int          //格子右边界坐标
    MinY      int          //格子上边界坐标
    MaxY      int          //格子下边界坐标
    playerIDs map[int]bool //当前格子内的玩家或者物体成员ID
    pIDLock   sync.RWMutex   //playerIDs的保护map的锁
}

//初始化一个格子
func NewGrid(gID, minX, maxX, minY, maxY int) *Grid {
    return &Grid{
        GID:gID,
        MinX:minX,
        MaxX:maxX,
        MinY:minY,
        MaxY:maxY,
        playerIDs:make(map[int] bool),
    }
}

//向当前格子中添加一个玩家
func (g *Grid) Add(playerID int) {
    g.pIDLock.Lock()
    defer g.pIDLock.Unlock()

    g.playerIDs[playerID] = true
}

//从格子中删除一个玩家
func (g *Grid) Remove(playerID int) {
    g.pIDLock.Lock()
    defer g.pIDLock.Unlock()

    delete(g.playerIDs, playerID)
}

//得到当前格子中所有的玩家
func (g *Grid) GetPlyerIDs() (playerIDs []int) {
    g.pIDLock.RLock()
    defer g.pIDLock.RUnlock()

    for k, _ := range g.playerIDs {
        playerIDs = append(playerIDs, k)
    }

    return
}


//打印信息方法
func (g *Grid) String() string {
    return fmt.Sprintf("Grid id: %d, minX:%d, maxX:%d, minY:%d, maxY:%d, playerIDs:%v",
        g.GID, g.MinX, g.MaxX, g.MinY, g.MaxY, g.playerIDs)

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

results matching ""

    No results matching ""