本文主要是介绍17-zinx-Golang-MMO-移动位置同步与广播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、移动位置与广播思路
- 二、移动位置同步
- 1 - 移动api
- 2 - 广播当前玩家的移动信息
- 3 - main中添加移动路由
- 三、测试结论
- 四、目录结构与完整源码
一、移动位置与广播思路
二、移动位置同步
1 - 移动api
- src/mmo_game_zinx/apis/move.go
package apisimport ("fmt""google.golang.org/protobuf/proto""mmo_game_zinx/core"pb "mmo_game_zinx/pb""zinx/ziface""zinx/znet"
)//玩家移动
type MoveApi struct {znet.BaseRouter
}func (m *MoveApi) Handle(request ziface.IRequest) {//解析客户端传递进来proto协议proto_msg := &pb.Position{}err := proto.Unmarshal(request.GetData(), proto_msg)if err != nil {fmt.Println("Move : Position Unmarshal error ", err)return}//得到当前发送位置的是哪个玩家pid, err := request.GetConnection().GetProperty("pid")if err != nil {fmt.Println("GetProperty pid error, ", err)return}fmt.Printf("Player pid = %d, move(%f,%f,%f,%f)\n", pid, proto_msg.X, proto_msg.Y, proto_msg.Z, proto_msg.V)//给其他玩家进行当前玩家的位置信息广播player := core.WorldMgrObj.GetPlayerByPid(pid.(int32))//广播并更新当前玩家的坐标player.UpdatePos(proto_msg.X, proto_msg.Y, proto_msg.Z, proto_msg.V)
}
2 - 广播当前玩家的移动信息
- src/mmo_game_zinx/core/player.go
//广播当前玩家的位置移动信息
func (p *Player) UpdatePos(x float32, y float32, z float32, v float32) {//更新当前玩家player对象的坐标p.X = xp.Y = yp.Z = zp.V = v//组建广播proto协议 MsgID:200 Tp-4proto_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,},},}//获取当前玩家的周边玩家AOI九宫格之内的玩家players := p.GetSuroundingPlayers()//一次给每个玩家对应的客户端发送当前玩家位置更新的消息for _, player := range players {player.SendMsg(200, proto_msg)}
}//获取当前玩家的周边玩家AOI九宫格之内的玩家
func (p *Player) GetSuroundingPlayers() []*Player {//得到当前AOI九宫格内的所有玩家PIDpids := WorldMgrObj.AoiMgr.GetPidsByPos(p.X, p.Z)//将所有的pid对应的Player放到Players切片中players := make([]*Player, 0, len(pids))for _, pid := range pids {players = append(players, WorldMgrObj.GetPlayerByPid(int32(pid)))}return players
}
3 - main中添加移动路由
- src/mmo_game_zinx/main.go
func main() {//创建zinx server句柄s := znet.NewServer("MMO Game Zinx")//连接创建和销毁的HOOK钩子函数s.SetOnConnStart(OnConnecionAdd)//注册一些路由业务s.AddRouter(2, &apis.WorldChatApi{})s.AddRouter(3, &apis.MoveApi{})//启动服务s.Serve()
}
三、测试结论
- 通过测试:我们可以看到任何的客户端移动都会同步到其他客户端,说明位置同步实现没有问题
四、目录结构与完整源码
点击下载完整源码:mmo_game_zinxV4.0
点击下载对应客户端:mmo_game_u3d_client
这篇关于17-zinx-Golang-MMO-移动位置同步与广播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!