• 3.3 实现AOI管理模块

    3.3 实现AOI管理模块

    那么接下来我们就要对格子添加到一个AOI模块中进行管理。我们创建一个aoi模块文件。

    mmo_game/core/aoi.go

    1. package core
    2. /*
    3. AOI管理模块
    4. */
    5. type AOIManager struct {
    6. MinX int //区域左边界坐标
    7. MaxX int //区域右边界坐标
    8. CntsX int //x方向格子的数量
    9. MinY int //区域上边界坐标
    10. MaxY int //区域下边界坐标
    11. CntsY int //y方向的格子数量
    12. grids map[int]*Grid //当前区域中都有哪些格子,key=格子ID, value=格子对象
    13. }
    14. /*
    15. 初始化一个AOI区域
    16. */
    17. func NewAOIManager(minX, maxX, cntsX, minY, maxY, cntsY int) *AOIManager {
    18. aoiMgr := &AOIManager{
    19. MinX: minX,
    20. MaxX: maxX,
    21. CntsX: cntsX,
    22. MinY: minY,
    23. MaxY: maxY,
    24. CntsY: cntsY,
    25. grids: make(map[int]*Grid),
    26. }
    27. //给AOI初始化区域中所有的格子
    28. for y := 0; y < cntsY; y++ {
    29. for x := 0; x < cntsX; x++ {
    30. //计算格子ID
    31. //格子编号:id = idy *nx + idx (利用格子坐标得到格子编号)
    32. gid := y*cntsX + x
    33. //初始化一个格子放在AOI中的map里,key是当前格子的ID
    34. aoiMgr.grids[gid] = NewGrid(gid,
    35. aoiMgr.MinX+ x*aoiMgr.gridWidth(),
    36. aoiMgr.MinX+(x+1)*aoiMgr.gridWidth(),
    37. aoiMgr.MinY+ y*aoiMgr.gridLength(),
    38. aoiMgr.MinY+(y+1)*aoiMgr.gridLength())
    39. }
    40. }
    41. return aoiMgr
    42. }
    43. //得到每个格子在x轴方向的宽度
    44. func (m *AOIManager) gridWidth() int {
    45. return (m.MaxX - m.MinX) / m.CntsX
    46. }
    47. //得到每个格子在x轴方向的长度
    48. func (m *AOIManager) gridLength() int {
    49. return (m.MaxY - m.MinY) / m.CntsY
    50. }
    51. //打印信息方法
    52. func (m *AOIManager) String() string {
    53. s := fmt.Sprintf("AOIManagr:\nminX:%d, maxX:%d, cntsX:%d, minY:%d, maxY:%d, cntsY:%d\n Grids in AOI Manager:\n",
    54. m.MinX, m.MaxX, m.CntsX, m.MinY, m.MaxY, m.CntsY)
    55. for _,grid := range m.grids {
    56. s += fmt.Sprintln(grid)
    57. }
    58. return s
    59. }

    以上是创建一个AOI模块(可以理解为一个2D的矩形地图),里面有若干份grids

    NewAOIManager()会平均划分多分小格子,并初始化格子的坐标,计算方式很简单,初步的几何计算。