概述
上一章讲解了房间管理的功能,本章将讲解桌子的具体开发
第一步 桌子结构体
[!TIP|style:flat|label:桌子的定义|iconVisibility:hidden] mqant将桌子的核心功能封装到了QTable中,开发者主要继承QTable完成业务功能的开发
type MyTable struct {
room.QTable
module module.RPCModule
players map[string]room.BasePlayer
}
第二步 必须要继承的函数
[!TIP|style:flat|label:继承函数|iconVisibility:hidden] QTable有两个结构体需要开发者提供,以实现其内部的功能
GetModule()
返回module.RPCModule
GetSeats()
返回一个桌子内座位(用户)的map
GetSeats() map[string]room.BasePlayer
可选继承函数
当桌子初始化后会调用OnCreate(),可以在这做一些业务初始化(加载数据)等操作,但一定要调用QTable.OnCreate()
func (this *MyTable) OnCreate() {
//可以加载数据
log.Info("MyTable OnCreate")
//一定要调用QTable.OnCreate()
this.QTable.OnCreate()
}
第三步 初始化QTable
[!TIP|style:flat|label:初始化参数|iconVisibility:hidden] QTable有许多设置参数都可以在初始化时设置,后续章节会详细阐述
OnInit(subtable SubTable, opts ...Option) error
this := &MyTable{
module: module,
players: map[string]room.BasePlayer{},
}
this.OnInit(this, opts...)
第四步 实现handler
[!TIP|style:flat|label:桌子hander|iconVisibility:hidden] 房间模块跟mqant的模块工作方式类似,也支持路由+handler的方式处理消息
handler实现
加入房间的handler
- 首先将session跟room.BasePlayer绑定
- 将room.BasePlayer注册桌子座位管理map中
- 最后广播了一条消息给所有已加入房间的客户端
func (this *MyTable) doJoin(session gate.Session, msg map[string]interface{}) (err error) {
player := &room.BasePlayerImp{}
player.Bind(session)
player.OnRequest(session)
this.players[session.GetSessionId()] = player
_ = this.NotifyCallBackMsg("/room/join", []byte(fmt.Sprintf("welcome to %v", msg["name"])))
return nil
}
handler注册
路由是 /room/join 处理函数为 doJoin
func NewTable(module module.RPCModule, opts ...room.Option) *MyTable {
this := &MyTable{
module: module,
players: map[string]room.BasePlayer{},
}
this.OnInit(this, opts...)
this.Register("/room/say", this.doSay)
this.Register("/room/join", this.doJoin)
return this
}
跟客户端约定的数据结构
{
"table_id":"{table_id}",
"action":"/room/say",
"name":"{name}"
}
消息传递
基于本教程示例,简单讲解消息传递流程
- 客户端发送消息给mqant房间模块指定handler(HD_room_say)
- HD_room_say通过消息中的table_id值获取(创建)桌子
- 通过table.PutQueue(action, session, msg)将消息写入桌子接收队列中
- 待桌子下一帧执行时从队列中取出消息
- 通过action找到桌子handler
- 调用桌子handler执行函数