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

相关文章

基于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

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

Linux Centos 迁移Mysql 数据位置

转自:http://www.tuicool.com/articles/zmqIn2 由于业务量增加导致安装在系统盘(20G)磁盘空间被占满了, 现在进行数据库的迁移. Mysql 是通过 yum 安装的. Centos6.5Mysql5.1 yum 安装的 mysql 服务 查看 mysql 的安装路径 执行查询 SQL show variables like

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使