🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 3.2 实现AOI格子结构 将aoi模块放在一个`core`模块中 > mmo\_game/core/grid.go ```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切片。