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

相关文章

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck