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

相关文章

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

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min