基于GoLang的MMO游戏服务器(四)

世界聊天

  • 首先定义世界聊天的路由方法

    具体实现
type WorldChatAPI struct {znet.BaseRouter
}func (wca WorldChatAPI) Handle(request ziface.IRequest) {pid, err := request.GetConnection().GetProperty("pid")if err != nil {fmt.Println(err)return}protoMsg := &Pb.Talk{}err = proto.Unmarshal(request.GetData(), protoMsg)if err != nil {fmt.Println(err)return}player := core.WorldMgrObj.GetPlayerByPid(pid.(int32))player.Talk(protoMsg.Content)
}
  • 对聊天业务的处理
func (p *Player) Talk(context string) {protoMsg := &Pb.BroadCase{Pid: p.Pid,Tp:  1,Data: &Pb.BroadCase_Content{Content: context,},}players := WorldMgrObj.GetAllPlayers()for _, player := range players {player.SendMsg(200, protoMsg)}
}

让周围玩家显示当前玩家,当前玩家显示其它玩家

  • 当玩家接入成功后,在回调中添加同步玩家方法
  • 告知其它玩家我上线
  • 告知我其它玩家位置信息
func (p *Player) SyncSurrounding() {playerIDs := WorldMgrObj.AoiMgr.GetSurroundPlayersByPos(p.X, p.Z)if playerIDs != nil && len(playerIDs) > 0 {// 告知其它玩家我上线protoMsg := &Pb.BroadCase{Pid: p.Pid,Tp:  2,Data: &Pb.BroadCase_P{P: &Pb.Position{X: p.X,Y: p.Y,Z: p.Z,V: p.V,}},}players := make([]*Pb.Player, 0, len(playerIDs))for i := 0; i < len(playerIDs); i++ {player := WorldMgrObj.GetPlayerByPid(int32(playerIDs[i]))players = append(players, &Pb.Player{Pid: int32(playerIDs[i]),P: &Pb.Position{X: player.X,Y: player.Y,Z: player.Z,V: player.V,},})player.SendMsg(200, protoMsg)}// 告知我其它玩家位置信息protoMsg1 := &Pb.SyncPlayers{Ps: players}p.SendMsg(202, protoMsg1)}}

同步玩家移动

  • 路由方法的具体实现
type MoveAPI struct {znet.BaseRouter
}func (m MoveAPI) Handle(request ziface.IRequest) {protoMsg := &Pb.Position{}err := proto.Unmarshal(request.GetData(), protoMsg)if err != nil {fmt.Println(err)return}pid, err := request.GetConnection().GetProperty("pid")if err != nil {fmt.Println(err)return}player := core.WorldMgrObj.GetPlayerByPid(pid.(int32))if player == nil {return}player.UpdatePos(protoMsg.X, protoMsg.Y, protoMsg.Z, protoMsg.V)
}
  • 更新玩家的位置
func (p *Player) UpdatePos(x, y, z, v float32) {p.X = xp.Y = yp.Z = zp.V = vprotoMsg := &Pb.BroadCase{Pid: p.Pid,Tp:  4,Data: &Pb.BroadCase_P{P: &Pb.Position{X: x,Y: y,Z: z,V: v,},},}playerIDs := WorldMgrObj.AoiMgr.GetSurroundPlayersByPos(x, z)for i := 0; i < len(playerIDs); i++ {player := WorldMgrObj.GetPlayerByPid(int32(playerIDs[i]))player.SendMsg(200, protoMsg)}
}

同步玩家下线功能

  • 添加连接断开回调函数
  • Offline方法具体实现
func (p *Player) Offline() {playerIDs := WorldMgrObj.AoiMgr.GetSurroundPlayersByPos(p.X, p.Z)protoMsg := &Pb.SyncPid{Pid: p.Pid}for i := 0; i < len(playerIDs); i++ {player := WorldMgrObj.GetPlayerByPid(int32(playerIDs[i]))player.SendMsg(201, protoMsg)}WorldMgrObj.RemovePlayerByPid(p.Pid)
}

基于GoLang的MMO游戏服务器(四)相关推荐

  1. 组件分享之后端组件——基于Golang语言的游戏服务器框架leaf

    组件分享之后端组件--基于Golang语言的游戏服务器框架leaf 背景 近期正在探索前端.后端.系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类 ...

  2. 解码mmo游戏服务器四:如何实现玩家状态的高同步性

    问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以cl ...

  3. MMO游戏服务器从零开发(架构篇)- 网络部分

    目录: MMO游戏服务器从零开发(架构篇) MMO游戏服务器从零开发(架构篇)- 网络部分 游戏服务器的网络分为2部分: 外网通信:服务器与客户端进行的网络数据交互. 对于使用java外网通信毋庸置疑 ...

  4. arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...

    介绍 Nano 是什么? 轻量级,方便,高性能 golang 的游戏服务器框架. nano 是一个轻量级的服务器框架,它最适合的应用领域是网页游戏.社交游戏.移动游戏的服务端.当然还不仅仅是游戏,用  ...

  5. golang的开源游戏服务器框架

    golang的游戏服务器框架有leaf, cellnet, mqant等. 一. 选择 cellnet好像使用callback回调方式, 直接pass. mqant使用了mqtt协议, 感觉写了太多, ...

  6. mmo游戏服务器性能指标,关于performance:厚积薄发MMORPG手游合理的性能参数

    1)MMORPG手游正当的性能参数 ​2)应用ScriptableBuildPipeline打包的疑难 3)如何获取到Animation批改材质球色彩后的色彩值 4)嵌套预设AssetBundle打包 ...

  7. golang Leaf 游戏服务器框架简介

    Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架.Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器. Leaf 的关注点: 良好的 ...

  8. MMO大型多人在线游戏服务器架构简述

    mmo服务器架构总体来说相对比较复杂,由多组服务器进程组成.而这些服务器进程大致分为两类,一类是平台服,另一类是普通服. 一.平台服 平台服务器一般都用于处理全局相关功能,涉及玩家登陆,角色唯一性认证 ...

  9. 游戏服务器框架 Leaf/go

    Leaf/go 详细介绍 Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率.Leaf 适用于几乎所有的游戏类型.其主要的特性: 良好的使用体验.Leaf 总是 ...

  10. golang游戏服务器项目,基于Golang的游戏服务器框架cellnet开发日记(一)

    启程的故事 使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, ...

最新文章

  1. @所有人,20 万大奖待领取!【全民找“BUG”】活动,等你!
  2. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
  3. SAP CRM IBASE保存的逻辑分析
  4. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题
  5. 问题二十七:ray traing中的positionable camera
  6. php 自动换行,php imagettftext 规定宽度内自动换行
  7. 高端物理学名词_物理名词中英文对照
  8. Xcelsius 2008和Crystal Xcelsius Professional 4.5截图对比
  9. 【Unity3D】资源文件 ③ ( Unity 资源包简介 | 导出 Unity 资源包 | 导出资源包的包含依赖选项 | 导入 Unity 资源包 | Unity 资源商店 )
  10. 0x300-从头开始写操作系统-内核
  11. 浅析网站 APP 登录界面设计
  12. 无法启动此程序,因为计算机丢失api-ms-win-crt-process-l1-1-0.dll
  13. Flak模型和应用(一对一,一对多,多对多)
  14. 人事考试在线报名系统新突破,一键触达“智慧考试”
  15. jupyter notebook设置标题折叠
  16. 工业以太网交换机在地铁中运用
  17. 主编编辑器如何快速找回未及时保存的文章
  18. Python爬虫实战之爬取百度音乐歌曲
  19. 游戏中的回放系统是如何实现的?
  20. SEC悬在加密企业头上的达摩克利斯之剑

热门文章

  1. Horner法则(秦九韶算法 )的程序实现
  2. premiere cs6导出视频格式
  3. Python- sklearn之最小二乘法
  4. amd显卡怎么设置风扇?
  5. web安全:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’
  6. bat 实现笔记本键盘开关
  7. Toolbar中setNavigationIcon的返回图标太大,图标大小调整解决方法
  8. Crushers is the determiner in mining industry
  9. 74HC163与74HC161 同步和异步计数器仿真示例
  10. Linux基础-进程管理