Skip to content

Latest commit

 

History

History
80 lines (58 loc) · 5.14 KB

公司棋牌项目的一些瞎想.md

File metadata and controls

80 lines (58 loc) · 5.14 KB

1、新玩法的创建优化

新玩法的创建总要在对应的 app/gameMode/xxx/region/gamePlays/xxx/ 添加一个 GamePlay_xx.lua 文件以及修改 RoomSetting 文件(添加一些规则设定) 而 RoomSetting 仅仅修改规则设定,规则描述又需要在 GamePlay_xx.lua 中去添加。其原理是 RoomSettingHelper.lua 中引用了 MultiArea.lua ,通过 areaId 来区分。 总结: GamePlay_xx 中的描述是加入了到 MultiArea.lua 中, 并没有知道加入到 RoomSetting.lua 感觉上是跑了两个地方,修改了一个东西。

建议: GamePlay_xx.lua 被限制必须且只能新建某些表(名字、键值限定), MultiArea.lua 去读 GamePlay_xx.lua 文件中的 table 动态插入到 RoomSetting 的对应表中。 若要修改 GamePlay_xx.lua 只有基本表(don't use class function), 尽量少或者不 require 任何其他文件

2、客户端一次启动,在 RequestHanlder #72  触发 Macro.assertTrue(resp:getRequestId() ~= 0)

callback 没有对应上, 消息没有回复

3、新玩法创建(app/gameMode/config/areas/xxxx(地区)/xxx(游戏类型).lua)

希望在 xxx.lua 中只需要配置一个table即可,当前是配置完一个table还要通过table.merge来做各个操作,很麻烦,才能配置成一个地区
目前,修改一个玩法名称需要修改的地方太多太杂,希望能够只修改一个地方,其他的是链式引用关系。

example:  now: 修改 app/gameMode/config/areas/xxx/xxx.lua 中某个玩法的名字, 我需要改 xxx.lua  GamePlay_xxx.lua UI_GAME_TYPE_XXX.lua 需要修改这些文件的键值或者修改一些引用关系,但他们大部分情况下键值是一样的。

4、新玩法创建

在添加一些ui文件的时候(GameScene UIPlayer),希望在 app.gameMode.base 中的文件能够紧密相连,完成一些基本的数据的运算与存储,具体的class可以重载。

example:  UIGameScene 已经存储了 所有的 uiplayer, 在玩家加入、离开的时候会调用 GameScene 的 update or remove or add player functions, 同时会调用 uiplayer 的 update, remove or add functions, 但是 UIPlayer 这个基类中却没有实现。 etc.

5、在客户端框架这块

保持 GameService GameScene Processor UIRoomSeat(UIPlayer) 的几个基本类,并且定义必须的方法,利用 断言 告诉子类必须实现这些方法(并且通过框架的基础类回调子类必须重写的这些方法),保持框架的稳固,如果只是做消息转发那框架的变化太大,不容易移植了

 local M = {}
 local M:fun1()
  assert(false, "implement by subclass")
 end
 local M:func2()
  assert(false, "implement by subclass")
 end
 
 local M2 = setmetatable({}, {__index = M})
 local M2:func1()
  print("implement func1()")
 end
 local M2:func2()
 print("implement func2()")
 end
 
 local Start = M2()
 Start:func1()
 Start:func2()

6、客户端重连也会发BattlePlayerInfoSYN

7. 若玩家已在牌局中离线后的处理流程(poker部分) 看上去不好,是需要改改

roomPlayerInfoSYN -> removeAllPlayer -> setRoomPlayers -> addPlayer -> xxx 在 setRoomPlayers 创建 PlayerProcessor removeAllPlayer 的时候会销毁 若已经处于打牌中, roomPlayerInfoSYN 接收到的时候会 销毁所有 PlayerProcessor 重新创建, 所以一些重要的UI、数据 不能放到 PlayerProcessor 中 应该放在 UIGameScene 创建的 UIPlayer 的派生类中, 通过 PlayerProcessor 的 onGameStart 的来传递数据

8、 关于第7点, 在炸金花的时候就遇到了。。。。 解决方案如下:

每当有 RoomPlayerInfoSYN 来的时候后, 会将新的数据与本地的数据进行一次校验, 得出是 update | add | remove 的其中一种,而不是纯粹的全部释放,再全部构建

9、 麻将的结构是 :

UIGamsScene GameService RoomService PlayerProcessor RoomProcessor UIRoomSeat

UIRoomSeat是存放在UIGameScene 中, poker也是这样的结构,能不能放到PlayerProcessor中呢?

10、今天开始合并跑得快到贵阳

GamePlay的registRuleType又报错了, 原因是这个GamePlay中引用RoomSetting的值空了。 优化点:任何新玩法的添加,抛开RoomSetting,自己新建两个文件,一个配置玩法的,一个新建规则的。RoomSetting会去引用这两个文件,并且检查有没有必要的字段和个数是否达到要求,没有达到要求提示,希望做到的结果:在玩法被创建的时候,确保所有的玩法lua文件都是可以被正确require的。

11、关于第2个问题的进一步

 如果被断言了,也可能是客户端在写 Protocol_XXX 的消息结构体的时候没有写构造方法,若直接调用了夫类的构造方法,可能就会把 callback 这个参数给忽略掉。

12、拼接URL的注意点:

在公司项目中,有一个拼接URL分享到微信的功能,原以为是分享功能出错,原来是在拼接URL时,没有对特殊的字符进行URL编码。 特殊的字符例如:空格、&、emoji等等。当然,这只存在于GET。