<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 八、上線位置信息同步 ![](/assets/20-zinx游戲案例-同步坐標業務.png)這里涉及到了MsgID:202消息,我們應該在proto文件中,再添加兩個消息 > mmo\_game/pb/msg.proto ```protobuf //玩家信息 message Player{ int32 Pid=1; Position P=2; } //同步玩家顯示數據 message SyncPlayers{ repeated Player ps=1; } ``` 執行build.sh 生成對應的`msg.proto.go`文件。 接下來,我們就要給player提供一個同步位置的方法了。 > mmo\_game/core/player.go ```go //給當前玩家周邊的(九宮格內)玩家廣播自己的位置,讓他們顯示自己 func (p *Player) SyncSurrounding() { //1 根據自己的位置,獲取周圍九宮格內的玩家pid pids := WorldMgrObj.AoiMgr.GetPidsByPos(p.X, p.Z) //2 根據pid得到所有玩家對象 players := make([]*Player, 0, len(pids)) //3 給這些玩家發送MsgID:200消息,讓自己出現在對方視野中 for _, pid := range pids { players = append(players, WorldMgrObj.GetPlayerByPid(int32(pid))) } //3.1 組建MsgId200 proto數據 msg := &pb.BroadCast{ Pid:p.Pid, Tp:2,//TP2 代表廣播坐標 Data: &pb.BroadCast_P{ P:&pb.Position{ X:p.X, Y:p.Y, Z:p.Z, V:p.V, }, }, } //3.2 每個玩家分別給對應的客戶端發送200消息,顯示人物 for _, player := range players { player.SendMsg(200, msg) } //4 讓周圍九宮格內的玩家出現在自己的視野中 //4.1 制作Message SyncPlayers 數據 playersData := make([]*pb.Player, 0, len(players)) for _, player := range players { p := &pb.Player{ Pid:player.Pid, P:&pb.Position{ X:player.X, Y:player.Y, Z:player.Z, V:player.V, }, } playersData = append(playersData, p) } //4.2 封裝SyncPlayer protobuf數據 SyncPlayersMsg := &pb.SyncPlayers{ Ps:playersData[:], } //4.3 給當前玩家發送需要顯示周圍的全部玩家數據 p.SendMsg(202, SyncPlayersMsg) } ``` 這里的過程只有兩個重要過程,一個是將自己的坐標信息發送給AOI范圍周邊的玩家,一個是將周邊玩家的坐標信息發送給自己的客戶端。 最后我們在用戶上線的時候,調用同步坐標信息的方法。 > mmo\_game/server.go ```go //當客戶端建立連接的時候的hook函數 func OnConnecionAdd(conn ziface.IConnection) { //創建一個玩家 player := core.NewPlayer(conn) //同步當前的PlayerID給客戶端, 走MsgID:1 消息 player.SyncPid() //同步當前玩家的初始化坐標信息給客戶端,走MsgID:200消息 player.BroadCastStartPosition() //將當前新上線玩家添加到worldManager中 core.WorldMgrObj.AddPlayer(player) //將該連接綁定屬性Pid conn.SetProperty("pid", player.Pid) //==============同步周邊玩家上線信息,與現實周邊玩家信息======== player.SyncSurrounding() //======================================================= fmt.Println("=====> Player pidId = ", player.Pid, " arrived ====") } ``` 最后我們運行程序進行一下簡單的測試. 啟動server ```bash $go run server.go ``` 分別啟動3個客戶端,看是否能夠互相看到對方。 ![](https://img.kancloud.cn/ec/46/ec461130ce97abcc9a2b7afe998e1d9f_1598x1228.png)![](/assets/22-zinx游戲案例-信息同步位置2.png)
                  <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>

                              哎呀哎呀视频在线观看