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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 7.2 世界聊天系統實現 接下來,我們來做一個玩家和玩家之間的世界聊天廣播功能。 ![](https://img.kancloud.cn/dc/f2/dcf27e79ed5bc285b5f6b608360e9301_1654x1498.png)A\) proto3協議定義 這里涉及到了MsgId:2的指令,還有對應的Talk的proto協議。 `MsgID`:2 `Talk`: * 同步玩家本次登錄的ID\(用來標識玩家\), 玩家登陸之后,由Server端主動生成玩家ID發送給客戶端 * 發起者: Client * Content: 聊天信息 ```protobuf message Talk{ string Content=1; } ``` 所以我們應該先修改proto文件 > mmo\_game/pb/msg.proto ```protobuf syntax="proto3"; //Proto協議 package pb; //當前包名 option csharp_namespace="Pb"; //給C#提供的選項 //同步客戶端玩家ID message SyncPid{ int32 Pid=1; } //玩家位置 message Position{ float X=1; float Y=2; float Z=3; float V=4; } //玩家廣播數據 message BroadCast{ int32 Pid=1; int32 Tp=2; //1-世界聊天 2-玩家位置 oneof Data { string Content=3; //聊天的信息 Position P=4; //廣播用戶的位置 int32 ActionData=5; } } //===================== //玩家聊天數據 message Talk{ string Content=1; //聊天內容 } //===================== ``` 執行build.sh 生成新的`msg.proto.go`文件。 #### B\) 聊天業務API建立 接下來,我們創建一個api文件 > mmo\_game/api/world\_chat.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 WorldChatApi struct { znet.BaseRouter } func (*WorldChatApi) Handle(request ziface.IRequest) { //1. 將客戶端傳來的proto協議解碼 msg := &pb.Talk{} err := proto.Unmarshal(request.GetData(), msg) if err != nil { fmt.Println("Talk 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 } //3. 根據pid得到player對象 player := core.WorldMgrObj.GetPlayerByPid(pid.(int32)) //4. 讓player對象發起聊天廣播請求 player.Talk(msg.Content) } ``` 這里實際上對于msgID:2的路由業務函數的實現。其中有個小細節需要注意一下。第2步,根據鏈接conn得到當前玩家的pid,應該是我們之前在玩家上線的時候,將pid和conn做一個屬性綁定,如下: > 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) //=============================================== fmt.Println("=====> Player pidId = ", player.Pid, " arrived ====") } ``` 接下來,我們來看一下Player里的Talk實現方法: > mmo\_game/core/player.go ```go //廣播玩家聊天 func (p *Player) Talk(content string) { //1. 組建MsgId200 proto數據 msg := &pb.BroadCast{ Pid:p.Pid, Tp:1,//TP 1 代表聊天廣播 Data: &pb.BroadCast_Content{ Content: content, }, } //2. 得到當前世界所有的在線玩家 players := WorldMgrObj.GetAllPlayers() //3. 向所有的玩家發送MsgId:200消息 for _, player := range players { player.SendMsg(200, msg) } } ``` #### C\) 測試世界聊天功能 我們在服務端運行server ```bash $go run server.go $ go run server.go Add api msgId = 2 [START] Server name: Zinx Game,listenner at IP: 0.0.0.0, Port 8999 is starting [Zinx] Version: V0.11, MaxConn: 3000, MaxPacketSize: 4096 start Zinx server Zinx Game succ, now listenning... Worker ID = 9 is started. Worker ID = 4 is started. Worker ID = 5 is started. Worker ID = 6 is started. Worker ID = 7 is started. Worker ID = 8 is started. Worker ID = 0 is started. Worker ID = 1 is started. Worker ID = 2 is started. Worker ID = 3 is started. ``` 打開兩個客戶端,分別互相聊天,效果如下,我們的聊天功能已經實現了。 ![](https://img.kancloud.cn/ef/41/ef41fb0bd1ad5f9469d53f86e0e81cf3_1602x1262.png)![](/assets/19-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>

                              哎呀哎呀视频在线观看