Lua面向对象编程

很多游戏都开始使用lua脚本了。以我来说,我刚工作时Lua脚本还只是大量的用在UI上,UI对面向对象编程还没有那么大的诉求,只是很脏的业务逻辑。之后开发的游戏已经完全让Lua来处理游戏逻辑了,这也是各种热更的需要,这时对面向对象的需求就大大增加了,比如游戏中有上百个NPC我们不能为每一个NPC都写一套逻辑,那简直就是噩梦,简直比喝一箱白花蛇草水还要caodan惊恐。还要借助oo思想,为所有NPC搞个基。搞个基类微笑。好言归正传,下面就讲解一下如何用Lua来写oo。

首先,要了解一下在Lua中oo实现的基础--table(没错,就是table,也是Lua的精髓),metatable(就是一个隐形table,能用setmetatable()设置,用getmetatable()取得),__index(metatable的一个key)。

这三者的关系是这样的:以索引一个tab中的值(index)为例,当tab[index] 时,先去tab中查找这个key,如果有则返回tab[index],如果没有则查找有没有metatable,没有则返回nil,有则查找metatable中有没有__index这个键,没有返回nil,有则在__index中查找。

所以__index是一个表,且__index是metatable表中的一个元素,metaltable表可以用setmetatable()附加给一个表。

所以,我们可以试着写一个类

classA = 
{
a = 0,
b = 0,
new = function(self,varA,varB) 构造函数
-- body
self.a = varA
self.b = varB
print("classA struction!")
local tab = {}
setmetatable(tab,self)
return tab
end,
}
classA.__index = classA --这句话的原因是因为setmetatable时 classA是metatable 所以他必須有一个__index

local test = classA:new(1,2)

print(test.a,test.b) 

//输出结果是1,2

这样看起来跟c++中的不一样,我们可以换一种写法:

classA = 
{
a = 0,
b = 0,
}

function classA:new(varA,varB) --用“:”默认传递self
-- body
self.a = varA
self.b = varB
print("classA struction!")
local tab = {}
setmetatable(tab,self)
return tab
end,
classA.__index = classA

local test = classA:new(1,2)

print(test.a,test.b) 

//输出结果一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值