[先说个前提哈,以上所说的都是在lua这门语言中,不同的语言有不同的处理技巧,不过话说回来,真正的这种面向对象的思维方式作为程序都是通用的,只不过是在不同的语言有不同的数据结构来支撑的实现而已].
今天再次看项目里面的现金赛代码,接着上篇提到的,我们是构造了一个完美二叉树的形,最开始我的比较初级(low)的想法的直接根据这个树的型(也就是指lua中的table的结构类型),即树的每个节点(table数据类型)一个大table包涵管理俩个人战斗的各种数据状态。
然后刚看了项目中的实现代码,发现上面的想法还是 too young too naive,实际上像如此大的数据状态的table需要存储管理的话,应该单独列一个模块出来处理,也就是在lua中的module ,然后里面内容也是包涵一个大table,加上各种实现处理的函数接口,调用
最后用一个全局函数OnNew () 如下 其实这个的思想也是使lua模仿c++的面向对象的编程思想来的
function OnNew()
local b= class("BattleTree", battle_tree) --class函数是lua里面
b:Init()
return b
end
说明下 class()是cocos2d-x为我们封装的函数,本身Lua没有这个函数。
PS: 在Lua中类的概念就是table表,说白了,函数的代码功能主要做的就是对父类super的表进行拷贝,不必深究细节,会用就行,起码我在项目里面看到的使用calss函数就是只有复制拷贝这一个作用而已
然后再这个table实现一个OnCreate()方法 或者init方法 作用就是以初始化成员变量,完成一些数据的赋值。如下:
function battle_tree:OnCreateNode(node_id,node_level,node_no)
self.node_id = node_id
self.node_level = node_level
self.node_no = node_no
self.create_ts = os.time()
end
然后这里就应该想到联系的问题了,这种思想是以完成了每个节点的俩俩人的一组对战状态的维护了,但是根据上面所说的比赛方式(32进16 - 16进8 - 8进4),我们还应该需要他们有关联的信息关系,而如何建立这种关系呢,就用到前面所建立的tree的信息了,主要就是dep 和num 这样能使他们有完善的联系,即给别人客户端也能根据这个num,dep所推出他们的各种节点的相关信息。
得有一个提供关联的SetRelation函数 如下:
function battle_tree:SetRelation(parent_node_id,lchild_node_id,rchild_node_id)
self.parent_node_id = parent_node_id or ''
self.lchild_node_id = lchild_node_id or ''