另一种面向对象写法参考
还有一种写法,可以参考openresty最佳实践的面向对象一章
这里给了大致的示例如下:
local B = {}
local mt = {__index=B}
function B:new(opt)
opt.age = opt.age or 10
opt.name = opt.name or 'heli'
return setmetatable(opt, mt)
end
function B:string()
print(string.format("****, %s %s", self.age, self.name))
end
local c = B:new{age=20, name='c'}
c:string()
local d = B:new{age=30, name='d'}
c:string()
d:string()
之前一篇文章只是简单的介绍lua的面向对象, 对这方面的理解还很浅,最近在游戏中实现了一个状态机, 这里简单介绍;
####思路介绍
- 状态有很多,需要有扩展性, 所以这里的状态有独立的类结构, 同时状态机作为一个功能要让每个角色对象身上都拥有自己的状态机, 因此也是一个类;
- 状态机里包含以唯一名字标记对应的状态, 由于状态对于一个游戏角色的行为来说, 可以看作是底层实现, 所以一些公共状态可以被; 状态之间的转换也通过一个类来实现, 这样 状态机就是有不同的状态实例, 状态转换实例组合而成, 这样做的目的自然是为了让状态机有更强的适应性, 针对不同的场景, 可以共用之前实现的状态, 由状态转换实例来决定状态机的运行;
####实现代码
行为状态机ASM
-- 有限状态机
ActionStateMechaine = {}
function ActionStateMechaine:new(o)
o = o or {}
setmetatable(o,self)
self.__index = self
o._curState = nil -- 注意好多网上与书上这里用self.xxx=xxx,这是错的,在生成