🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 3.3 实现AOI管理模块 那么接下来我们就要对格子添加到一个AOI模块中进行管理。我们创建一个aoi模块文件。 > mmo\_game/core/aoi.go ```go package core /* AOI管理模块 */ type AOIManager struct { MinX int //区域左边界坐标 MaxX int //区域右边界坐标 CntsX int //x方向格子的数量 MinY int //区域上边界坐标 MaxY int //区域下边界坐标 CntsY int //y方向的格子数量 grids map[int]*Grid //当前区域中都有哪些格子,key=格子ID, value=格子对象 } /* 初始化一个AOI区域 */ func NewAOIManager(minX, maxX, cntsX, minY, maxY, cntsY int) *AOIManager { aoiMgr := &AOIManager{ MinX: minX, MaxX: maxX, CntsX: cntsX, MinY: minY, MaxY: maxY, CntsY: cntsY, grids: make(map[int]*Grid), } //给AOI初始化区域中所有的格子 for y := 0; y < cntsY; y++ { for x := 0; x < cntsX; x++ { //计算格子ID //格子编号:id = idy *nx + idx (利用格子坐标得到格子编号) gid := y*cntsX + x //初始化一个格子放在AOI中的map里,key是当前格子的ID aoiMgr.grids[gid] = NewGrid(gid, aoiMgr.MinX+ x*aoiMgr.gridWidth(), aoiMgr.MinX+(x+1)*aoiMgr.gridWidth(), aoiMgr.MinY+ y*aoiMgr.gridLength(), aoiMgr.MinY+(y+1)*aoiMgr.gridLength()) } } return aoiMgr } //得到每个格子在x轴方向的宽度 func (m *AOIManager) gridWidth() int { return (m.MaxX - m.MinX) / m.CntsX } //得到每个格子在x轴方向的长度 func (m *AOIManager) gridLength() int { return (m.MaxY - m.MinY) / m.CntsY } //打印信息方法 func (m *AOIManager) String() string { s := fmt.Sprintf("AOIManagr:\nminX:%d, maxX:%d, cntsX:%d, minY:%d, maxY:%d, cntsY:%d\n Grids in AOI Manager:\n", m.MinX, m.MaxX, m.CntsX, m.MinY, m.MaxY, m.CntsY) for _,grid := range m.grids { s += fmt.Sprintln(grid) } return s } ``` 以上是创建一个AOI模块\(可以理解为一个2D的矩形地图\),里面有若干份`grids`。 `NewAOIManager()`会平均划分多分小格子,并初始化格子的坐标,计算方式很简单,初步的几何计算。