- 3.2 实现AOI格子结构
3.2 实现AOI格子结构
将aoi模块放在一个core模块中
mmo_game/core/grid.go
package coreimport "sync"/*一个地图中的格子类*/type Grid struct {GID int //格子IDMinX int //格子左边界坐标MaxX int //格子右边界坐标MinY int //格子上边界坐标MaxY int //格子下边界坐标playerIDs map[int]bool //当前格子内的玩家或者物体成员IDpIDLock 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切片。
