概述

上一章讲解了房间管理的功能,本章将讲解桌子的具体开发

第一步 桌子结构体

[!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有两个结构体需要开发者提供,以实现其内部的功能

  1. GetModule()

    返回module.RPCModule

  2. 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

  1. 首先将session跟room.BasePlayer绑定
  2. 将room.BasePlayer注册桌子座位管理map中
  3. 最后广播了一条消息给所有已加入房间的客户端
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}"
}

消息传递

基于本教程示例,简单讲解消息传递流程

  1. 客户端发送消息给mqant房间模块指定handler(HD_room_say)
  2. HD_room_say通过消息中的table_id值获取(创建)桌子
  3. 通过table.PutQueue(action, session, msg)将消息写入桌子接收队列中
  4. 待桌子下一帧执行时从队列中取出消息
  5. 通过action找到桌子handler
  6. 调用桌子handler执行函数

Copyright © 梁大帅 2020 all right reserved,powered by Gitbook该文件修订时间: 2020-05-17 17:58:52

results matching ""

    No results matching ""