## 十、玩家下线
那么玩家客户端点击关闭应该触发玩家下线的功能.玩家应该在其他的客户端消失。具体流程如下:
![](/assets/25-zinx游戏案例-玩家下线.png)玩家下线,这里采用了`MsgID:201`消息。触发该流程的时机是客户端与服务端断开链接,那么我们就可以在连接断开前的Hook方法中,实现此业务.
> mmo\_game/server.go
```go
//当客户端断开连接的时候的hook函数
func OnConnectionLost(conn ziface.IConnection) {
//获取当前连接的Pid属性
pid, _ := conn.GetProperty("pid")
//根据pid获取对应的玩家对象
player := core.WorldMgrObj.GetPlayerByPid(pid.(int32))
//触发玩家下线业务
if pid != nil {
player.LostConnection()
}
fmt.Println("====> Player ", pid , " left =====")
}
func main() {
//创建服务器句柄
s := znet.NewServer()
//注册客户端连接建立和丢失函数
s.SetOnConnStart(OnConnecionAdd)
// ========== 注册 hook 函数 =====
s.SetOnConnStop(OnConnectionLost)
// ==============================
//注册路由
s.AddRouter(2, &api.WorldChatApi{})
s.AddRouter(3, &api.MoveApi{})
//启动服务
s.Serve()
}
```
然后我们就要给player模块提供一个`LostConnection()`方法。
> mmo\_game/core/player.go
```go
//玩家下线
func (p *Player) LostConnection() {
//1 获取周围AOI九宫格内的玩家
players := p.GetSurroundingPlayers()
//2 封装MsgID:201消息
msg := &pb.SyncPid{
Pid:p.Pid,
}
//3 向周围玩家发送消息
for _, player := range players {
player.SendMsg(201, msg)
}
//4 世界管理器将当前玩家从AOI中摘除
WorldMgrObj.AoiMgr.RemoveFromGridByPos(int(p.Pid), p.X, p.Z)
WorldMgrObj.RemovePlayerByPid(p.Pid)
}
```
接下来我们启动服务器,再启动两个客户端分别测试一下结果。
![](https://img.kancloud.cn/29/53/2953c0d2a58edac9c188a2352939e7c0_1594x676.png)
![](/assets/27-zinx游戏案例-玩家线下2.png)当我们退出一个客户端的时候,另外一个客户端的玩家的地图已经会摘除当前玩家了。
- 一、引言
- 1、写在前面
- 2、初探Zinx架构
- 二、初识Zinx框架
- 1. Zinx-V0.1-基础Server
- 2.Zinx-V0.2-简单的连接封装与业务绑定
- 三、Zinx框架基础路由模块
- 3.1 IRequest 消息请求抽象类
- 3.2 IRouter 路由配置抽象类
- 3.3 Zinx-V0.3-集成简单路由功能
- 3.4 Zinx-V0.3代码实现
- 3.5 使用Zinx-V0.3完成应用程序
- 四、Zinx的全局配置
- 4.1 Zinx-V0.4增添全局配置代码实现
- 4.2 使用Zinx-V0.4完成应用程序
- 五、Zinx的消息封装
- 5.1 创建消息封装类型
- 5.2 消息的封包与拆包
- 5.3 Zinx-V0.5代码实现
- 5.4 使用Zinx-V0.5完成应用程序
- 六、Zinx的多路由模式
- 6.1 创建消息管理模块
- 6.2 Zinx-V0.6代码实现
- 6.3 使用Zinx-V0.6完成应用程序
- 七、Zinx的读写分离模型
- 7.1 Zinx-V0.7代码实现
- 7.2 使用Zinx-V0.7完成应用程序
- 八、Zinx的消息队列及多任务机制
- 8.1 创建消息队列
- 8.2 创建及启动Worker工作池
- 8.3 发送消息给消息队列
- 8.4 Zinx-V0.8代码实现
- 8.5 使用Zinx-V0.8完成应用程序
- 九、Zinx的链接管理
- 9.1 创建链接管理模块
- 9.2 链接管理模块集成到Zinx中
- 9.3 链接的带缓冲的发包方法
- 9.4 注册链接启动/停止自定义Hook方法功能
- 9.5 使用Zinx-V0.9完成应用程序
- 十、Zinx的连接属性设置
- 10.1 给链接添加链接配置接口
- 10.2 链接属性方法实现
- 10.3 链接属性Zinx-V0.10单元测试
- 基于Zinx的应用案例
- 一、应用案例介绍
- 二、服务器应用基础协议
- 三、MMO多人在线游戏AOI算法
- 3.1 网络法实现AOI算法
- 3.2 实现AOI格子结构
- 3.3 实现AOI管理模块
- 3.4 求出九宫格
- 3.5 AOI格子添加删除操作
- 3.6 AOI模块单元测试
- 四、数据传输协议protocol buffer
- 4.1 简介
- 4.2 数据交换格式
- 4.3 protobuf环境安装
- 4.4 protobuf语法
- 4.5 编译protobuf
- 4.6 利用protobuf生成的类来编码
- 五、MMO游戏的Proto3协议
- 六、构建项目与用户上线
- 6.1 构建项目
- 6.2用户上线流程
- 七、世界聊天系统实现
- 7.1 世界管理模块
- 7.2 世界聊天系统实现
- 八、上线位置信息同步
- 九、移动位置与AOI广播(未跨越格子)
- 十、玩家下线
- 十一、移动与AOI广播(跨越格子)