16-zinx-Golang-MMO-上线位置信息同步

2023-10-23 08:59

本文主要是介绍16-zinx-Golang-MMO-上线位置信息同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 一、上线位置信息同步思路
  • 二、上线位置信息同步实现
    • 1 - 新增proto协议
    • 2 - 同步玩家上线的位置消息
  • 三、测试结论
  • 四、目录结构与完整源码

前言

  • 之前我们已经实现了玩家的世界聊天,能看到聊天但是无法看到周围的玩家,接来就要实现玩家的位置信息同步

一、上线位置信息同步思路

在这里插入图片描述
在这里插入图片描述

二、上线位置信息同步实现

1 - 新增proto协议

  • src/mmo_game_zinx/pb/msg.proto:这⾥涉及到了MsgID:202消息,我们应该在proto⽂件中,再添加两个消息
//同步玩家的显示数据
message SyncPlayers{repeated Player ps=1;
}//玩家信息
message Player{int32 Pid=1;Position P=2;
}

2 - 同步玩家上线的位置消息

  • src/mmo_game_zinx/main.go:增加调用同步周边玩家player.SyncSurrounding()
//当前客户端建立连接之后的hook函数
func OnConnecionAdd(conn ziface.IConneciton) {//创建一个Player对象player := core.NewPlayer(conn)//给客户端发送MsgID:1的消息: 同步当前Player的ID给客户端player.SyncPid()//给客户端发送MsgID:200的消息: 同步当前Player的初始位置给客户端player.BroadCastStartPosition()//将当前新上线的玩家添加到WorldManager中core.WorldMgrObj.AddPlayer(player)//将该连接绑定一个Pid 玩家ID的属性conn.SetProperty("pid", player.Pid)//同步周边玩家,告知他们当前玩家已经上线,广播当前玩家的位置信息player.SyncSurrounding()fmt.Println("=====> Player pid = ", player.Pid, " is arrived <=====")
}
  • src/mmo_game_zinx/core/player.go:实现方法 —— 同步玩家上线的位置信息
//同步玩家上线的位置消息
func (p *Player) SyncSurrounding() {//	1 获取当前玩家周围的玩家有哪些(九宫格)pids := WorldMgrObj.AoiMgr.GetPidsByPos(p.X, p.Z)fmt.Println("SyncSurounding.. player ids = ", pids)players := make([]*Player, 0, len(pids))for _, pid := range pids {players = append(players, WorldMgrObj.GetPlayerByPid(int32(pid)))}//  2 将当前玩家的位置信息通过MsgID:200 发给周围的玩家(让其他玩家看到自己)//2.1 组建MsgID:200 proto数据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,},},}//2.2 全部周围的玩家都向格子的客户端发送200消息,proto_msgfor _, player := range players {player.SendMsg(200, proto_msg)}//	3 将周围的全部玩家的位置信息发送给当前的玩家MsgID:202 客户端(让自己看到其他玩家)//3.1 组建MsgID:202 proto数据//3.1.1 制作pb.Player sliceplayers_proto_msg := make([]*pb.Player, 0, len(players))for _, player := range players {//制作一个message Playerp := &pb.Player{Pid: player.Pid,P: &pb.Position{X: player.X,Y: player.Y,Z: player.Z,V: player.V,},}players_proto_msg = append(players_proto_msg, p)}//3.1.2 封装SyncPlayer protobuf数据SyncPlayers_proto_msg := &pb.SyncPlayers{Ps: players_proto_msg[:],}//3.2 将组建好的数据发送给当前玩家的客户端p.SendMsg(202, SyncPlayers_proto_msg)
}

三、测试结论

  • 测试截图:可以看到每个player都可以看到其他player的上线

在这里插入图片描述

四、目录结构与完整源码

在这里插入图片描述

点击下载完整源码:mmo_game_zinxV3.0
点击下载对应客户端:mmo_game_u3d_client

这篇关于16-zinx-Golang-MMO-上线位置信息同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

精准寻车+鸿蒙有礼特别版均已上线! 华为鸿蒙HarmonyOS 6负一屏新升级

《精准寻车+鸿蒙有礼特别版均已上线!华为鸿蒙HarmonyOS6负一屏新升级》不少朋友升级华为鸿蒙HarmonyOS6后,发现华为负一屏此次也新增了精准寻车功能,还为过往鸿蒙5.1及以上用户再度... 最近科技圈热议话题当属华为全新发布的Mate 80系列,这次不仅有全金属机身,第二代红枫影像和全新麒麟新品

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序