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操作DuckDB实战案例分享

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

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

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

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

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

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

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

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p