lua面向对象与基于lua的状态机实现

这篇博客介绍了如何在Lua中实现面向对象编程以及基于Lua的状态机。状态机设计中,状态作为独立的类,状态机作为一个拥有自身状态机的角色类。状态机通过状态实例和状态转换实例组合,具有良好的扩展性和适应性。文章提供了状态机的主要结构和成员函数,以及状态类的定义和状态转换条件的判断。最后,展示了创建和测试状态机的示例代码。
摘要由CSDN通过智能技术生成

另一种面向对象写法参考
还有一种写法,可以参考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的面向对象, 对这方面的理解还很浅,最近在游戏中实现了一个状态机, 这里简单介绍;

####思路介绍

  1. 状态有很多,需要有扩展性, 所以这里的状态有独立的类结构, 同时状态机作为一个功能要让每个角色对象身上都拥有自己的状态机, 因此也是一个类;
  2. 状态机里包含以唯一名字标记对应的状态, 由于状态对于一个游戏角色的行为来说, 可以看作是底层实现, 所以一些公共状态可以被; 状态之间的转换也通过一个类来实现, 这样 状态机就是有不同的状态实例, 状态转换实例组合而成, 这样做的目的自然是为了让状态机有更强的适应性, 针对不同的场景, 可以共用之前实现的状态, 由状态转换实例来决定状态机的运行;

####实现代码
行为状态机ASM

-- 有限状态机
ActionStateMechaine = {}
function ActionStateMechaine:new(o)
  o = o or {}
  setmetatable(o,self)
  self.__index = self
  o._curState = nil       --  注意好多网上与书上这里用self.xxx=xxx,这是错的,在生成
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值