Lua的使用入门之在C++程序中调用lua函数1

学习lua将近半个月了,以前也了解过,只是没有实际运用的环境。

现在将自己这半个月来的心得写下来。


首先,要想在C++程序中作用lua脚本,必须包含相应的lua头文件,

extern "C" 
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

因为lua是基于c的,所以要使变量和函数按照C语言方式编译和连接

在你的编译环境中要包含lua的头文件,我的是lua5.1版本&vs2008 sp1,所以在包含目录中包含了相应include和lib目录,应该如下:






开发环境搭建完成以后,第一步就是要声明一个lua的状态机:

lua_State *g_pState = lua_open();// 新建一个lua状态
luaopen_base(g_pState);// 启动lua
luaopen_string(g_pState);// 初始化lua string库,可以作用string
luaL_openlibs(g_pState);// 
luaopen_math(g_pState);// 初始化

之后要定义一个lua文件如下:

script.lua:

name = "3D Text Lua";
tableWorld = {posX=-2.5, posY=-2.0, posZ=1.0};
function move()
tableWorld["posX"] = tableWorld["posX"] + 0.0;
tableWorld["posY"] = tableWorld["posY"] + 0.1;--在Y轴正方向上每次刷新移动0.1个单位
tableWorld["posZ"] = tableWorld["posZ"] + 0.0;
if(tableWorld["posY"] > 2.0) then--设置Y轴移动范围在(-2.0,2.0)之间
tableWorld["posY"] = -2.0;
end
end

这是一个要打印一个3D文本“3D Text Lua"的脚本,打印内容作为一个全局变量name放在lua中,在lua中,如果没有写明local前缀,那么这个变量是全局的。

有个move()函数, 是设置字体的运动轨迹的.

lua文件定义完毕,那么就要在c++程序中调用lua文件中的内容了:

首先要加载script.lua到内存中并编译lua文件成目标代码:

if (int error = luaL_dofile(g_pState, "script.lua") != 0)//加载lua文件并编译
{
MessageBox(NULL,L"加载script.lua失败!",NULL, 0);
exit(0);
}
lua_settop(g_pState, 0);// 清除lua状态机堆栈
lua_getglobal(g_pState, "name");//取出script.lua中全局变量name
if (!lua_isstring(g_pState, 1))//判定栈顶的变量是不是字符串
{
MessageBox(NULL,L"没有找到文本luaText",NULL , 0);
exit(0);
}
1. 取出脚本文本内容:g_strText = lua_tostring(g_pState, -1);//该函数将栈顶的内存转换成字符串类型,其实是const char*,这样就拿到了这个文本
lua_pop(g_pState, 1);// 弹出栈元素

2.调用lua内的move()函数

调用函数的方式与调用普通的C函数是一样的,只要拿到函数首地址就行了:

 // get func move
lua_getglobal(g_pState, "move");//拿到名称为move的lua变量并放入栈顶
if (!lua_isfunction(g_pState, -1))//判断是不是函数类型
{
MessageBox(NULL, L"move is not a function", NULL, 0);
exit(0);
}
lua_call(g_pState,0,0);//通过lua_api lua_call调用栈顶的函数,其中第二个参数表示函数参数个数,第三个参数表示返回值个数;对,lua是可以返回多值的。这样只要在每次刷新的时候调用一次上面的语句就可以了。

具体可执行文件在下面附件中,其中源代码改编自Directx图形与动画程序设计中的Fon_3D程序。

由于不能上传附件,下面给出程序下载链接:

http://download.csdn.net/detail/yuanmushen/6529011

欢迎大家指正错误!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值