<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 功能強大 支持多語言、二開方便! 廣告
                ## 九、移動位置與AOI廣播\(未跨越格子\) 現在我們來添加玩家移動的時候,周邊玩家顯示同步位置,具體流程圖,如下: ![](https://img.kancloud.cn/35/28/35282d4eab7f40191d80c13325c25f2a_1678x1322.png) 這里面涉及到兩個消息MsgID:3和 MsgID200,Tp=4。當玩家移動的時候,客戶端會主動給服務端發送`MsgID:3`的消息. 所以首先,我們應該給服務端注冊`MsgID:3`的路由處理業務 > mmo\_game/ server.go ```go func main() { //創建服務器句柄 s := znet.NewServer() //注冊客戶端連接建立和丟失函數 s.SetOnConnStart(OnConnecionAdd) //注冊路由 s.AddRouter(2, &api.WorldChatApi{}) //聊天 s.AddRouter(3, &api.MoveApi{}) //移動 //啟動服務 s.Serve() } ``` 接下來,我們需要創建一個api接口,實現`MoveApi{}`模塊. > mmo\_game/api/move.go ```go package api import ( "fmt" "github.com/golang/protobuf/proto" "zinx/ziface" "zinx/zinx_app_demo/mmo_game/core" "zinx/zinx_app_demo/mmo_game/pb" "zinx/znet" ) //玩家移動 type MoveApi struct { znet.BaseRouter } func (*MoveApi) Handle(request ziface.IRequest) { //1. 將客戶端傳來的proto協議解碼 msg := &pb.Position{} err := proto.Unmarshal(request.GetData(), msg) if err != nil { fmt.Println("Move: Position Unmarshal error ", err) return } //2. 得知當前的消息是從哪個玩家傳遞來的,從連接屬性pid中獲取 pid, err := request.GetConnection().GetProperty("pid") if err != nil { fmt.Println("GetProperty pid error", err) request.GetConnection().Stop() return } fmt.Printf("user pid = %d , move(%f,%f,%f,%f)", pid, msg.X, msg.Y, msg.Z, msg.V) //3. 根據pid得到player對象 player := core.WorldMgrObj.GetPlayerByPid(pid.(int32)) //4. 讓player對象發起移動位置信息廣播 player.UpdatePos(msg.X, msg.Y, msg.Z, msg.V) } ``` `move.go`的業務和我們之前的`world_chat.go`的業務很像。最后調用了`Player.UpdatPos()`方法,該方法是主要處理及發送同步消息的方法。我們接下來一起實現這個方法. > mmo\_game/core/player.go ```go //廣播玩家位置移動 func (p *Player) UpdatePos(x float32, y float32, z float32, v float32) { //更新玩家的位置信息 p.X = x p.Y = y p.Z = z p.V = v //組裝protobuf協議,發送位置給周圍玩家 msg := &pb.BroadCast{ Pid:p.Pid, Tp:4, //4 - 移動之后的坐標信息 Data: &pb.BroadCast_P{ P:&pb.Position{ X:p.X, Y:p.Y, Z:p.Z, V:p.V, }, }, } //獲取當前玩家周邊全部玩家 players := p.GetSurroundingPlayers() //向周邊的每個玩家發送MsgID:200消息,移動位置更新消息 for _, player := range players { player.SendMsg(200, msg) } } //獲得當前玩家的AOI周邊玩家信息 func (p *Player) GetSurroundingPlayers() []*Player { //得到當前AOI區域的所有pid pids := WorldMgrObj.AoiMgr.GetPidsByPos(p.X, p.Z) //將所有pid對應的Player放到Player切片中 players := make([]*Player, 0, len(pids)) for _, pid := range pids { players = append(players, WorldMgrObj.GetPlayerByPid(int32(pid))) } return players } ``` 其中`GetSurroundingPlayers()`是獲取當前玩家AOI周邊的玩家Player對象有哪些。 該方法的整體思路是獲取周邊的所有玩家,發送位置更新信息。 下面我們再次啟動服務器,同時開3個客戶端,看看最后的效果。 ![](https://img.kancloud.cn/b3/1d/b31db031b519b426211df64d6acc796d_1196x834.png) 顯示證明,3個客戶端已經可以實現移動同步的過程,那么實際上,我們基本的MMO大型網游在線游戲的基礎模型已經搭建完成了,接下來至于添加一些其他的游戲機制,比如對戰,積分等。實際上可以基于這個開發架構和流程繼續迭代開發了。
                  <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>

                              哎呀哎呀视频在线观看