<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 3.4 求出九宮格 ##### A\)根據格子ID求出九宮格 現在我們根據格子ID`gid`求出周邊的格子有哪些? 我們可能要考慮一些情況,比如格子的四周都有,如下圖: ![](https://img.kancloud.cn/66/dd/66ddd2ac7a512b7d08e16c73876ed7e8_1024x768.jpeg)或者,格子所在AOI區域的四個頂角,如下圖: ![](https://img.kancloud.cn/bd/11/bd1121dfaf9dc8be3c9828ffcfbbbbcb_1024x768.jpeg)或者給所在AOI邊界,周邊的格子缺少一列,或者缺少一行。 思考一下,我們是否可以想一個統一的方法,將所有的條件都滿足。 如果求出一個gid的周邊九宮格,那么可以先算出該gid所處一行左邊和右邊是否有,然后在分別計算這一行的上邊和下邊的格子是否有,就可以了。 思路如下: ![](https://img.kancloud.cn/b2/0a/b20afd1a1556427fb8fb9361d651cb68_1024x768.jpeg)![](/assets/10-Zinx游戲-AOI算法分析5.jpeg)![](/assets/11-Zinx游戲-AOI算法分析6.jpeg)參考代碼如下: > mmo\_game/core/aoi.go ```go //根據格子的gID得到當前周邊的九宮格信息 func (m *AOIManager) GetSurroundGridsByGid(gID int) (grids []*Grid) { //判斷gID是否存在 if _, ok := m.grids[gID]; !ok { return } //將當前gid添加到九宮格中 grids = append(grids, m.grids[gID]) //根據gid得到當前格子所在的X軸編號 idx := gID % m.CntsX //判斷當前idx左邊是否還有格子 if idx > 0 { grids = append(grids, m.grids[gID-1]) } //判斷當前的idx右邊是否還有格子 if idx < m.CntsX - 1 { grids = append(grids, m.grids[gID+1]) } //將x軸當前的格子都取出,進行遍歷,再分別得到每個格子的上下是否有格子 //得到當前x軸的格子id集合 gidsX := make([]int, 0, len(grids)) for _, v := range grids { gidsX = append(gidsX, v.GID) } //遍歷x軸格子 for _, v := range gidsX { //計算該格子處于第幾列 idy := v / m.CntsX //判斷當前的idy上邊是否還有格子 if idy > 0 { grids = append(grids, m.grids[v-m.CntsX]) } //判斷當前的idy下邊是否還有格子 if idy < m.CntsY - 1 { grids = append(grids, m.grids[v+m.CntsX]) } } return } ``` ##### B\)根據坐標求出九宮格 還有一種情況是玩家只知道自己的坐標,那么如何確定玩家AOI九宮格的區域都有哪些玩家呢,那就需要設計一個根據坐標求出周邊九宮格中玩家的接口。 ![](/assets/12-Zinx游戲-AOI算法分析7.jpeg)我們首先應該根據坐標得到所屬的格子ID,然后再走根據格子ID獲取九宮格信息就可以了。 > mmo\_game/core/aoi.go ```go //通過橫縱坐標獲取對應的格子ID func (m *AOIManager) GetGIDByPos(x, y float32) int { gx := (int(x) - m.MinX) / m.gridWidth() gy := (int(x) - m.MinY) / m.gridLength() return gy * m.CntsX + gx } //通過橫縱坐標得到周邊九宮格內的全部PlayerIDs func (m *AOIManager) GetPIDsByPos(x, y float32) (playerIDs []int) { //根據橫縱坐標得到當前坐標屬于哪個格子ID gID := m.GetGIDByPos(x, y) //根據格子ID得到周邊九宮格的信息 grids := m.GetSurroundGridsByGid(gID) for _, v := range grids { playerIDs = append(playerIDs, v.GetPlyerIDs()...) fmt.Printf("===> grid ID : %d, pids : %v ====", v.GID, v.GetPlyerIDs()) } return } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看