17-zinx-Golang-MMO-移动位置同步与广播

2023-10-23 08:59

本文主要是介绍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-移动位置同步与广播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/266829

相关文章

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流