【游戏_忍者六道】状态机设计与应用之lua篇

47 篇文章 20 订阅 ¥29.90 ¥99.00

一 前言

上一篇图文描述了C++实现游戏中应用的状态机,C++中的三大特性:封装,继承,多态得以应用,封装数据引擎访问的增,删,查,改,状态机基类以及多种状态子类实现私有private或者公共public继承它,但是发挥更大的作用是多态的使用,子类继承实现基类的virtual虚函数,在不同的事件机制触发下,迁移变换执行不同的状态,虽然毫无标准顺序可言,却是按照指定规则轨道正确行使,这是状态机设计的正确使用的最妙之处,起码是当前使用是这样,不同的需求会设计出不同高效的状态机。

那么,lua在状态机方面是如何应用的呢?

众所周知,lua是游戏开发中效率颇高的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。现在很多游戏(无论手游,还是端游),都为它的强大所折服,ps和魔兽都有使用lua,不得不承认,lua这方面做得确实很不错,虽然lua是面向过程和函数式编程,但是它的闭包和table特性使得它像C++一样,很完美的实现OO——面向对象。

二 状态机实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在导出一个lua状态机的所有函数时,首先需要明确导出哪些函数。在Lua中可以通过在C语言中调用该状态机的函数来实现与Lua中定义的函数交互,因此我们需要将需要导出的函数在C语言中进行实现。 导出函数时需要注意以下几点: 1. 需要使用luaL_Reg结构定义需要导出的函数属性,其中包含函数名和函数指针; 2. 在实现C语言函数时,需要将其与Lua中的参数和返回值进行对应; 3. 调用luaL_register函数注册需要导出的函数,传入函数表名和函数表属性,同时借助luaL_newlib函数创建新的函数表。 例如,我们需要导出以下三个函数: 1. 输出Hello World:printHello() 2. 计算两个数字的和:add(x, y) 3. 判断一个数是否为正数:isPositive(num) 那么在C语言中,可以这样实现: static int l_printHello(lua_State *L) { printf("Hello World\n"); return 0; } static int l_add(lua_State *L) { double x = luaL_checknumber(L, 1); double y = luaL_checknumber(L, 2); lua_pushnumber(L, x + y); return 1; } static int l_isPositive(lua_State *L) { double num = luaL_checknumber(L, 1); lua_pushboolean(L, num > 0); return 1; } 然后我们需要将其存到一个luaL_Reg结构体数组里,如下: static const struct luaL_Reg myfuncs[] = { {"printHello", l_printHello}, {"add", l_add}, {"isPositive", l_isPositive}, {NULL, NULL} }; 最后,我们可以在Lua中这样使用这些函数: local mylib = require("mylib") mylib.printHello() -- 输出Hello World print(mylib.add(1, 2)) -- 输出3 print(mylib.isPositive(-1)) -- 输出false 因此,以上就是导出一个lua状态机的所有函数的步骤和实现方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值