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