资源描述:
《在你的游戏中应用LUA.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、在你的游戏中应用LUA(ZT)-在你的游戏中应用Lua(1):在你的游戏代码中运行解释器 通常,你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息。 是的,或许你认为这样就足够了,为什么还要使用Lua呢? 应用于“配置”这个目的,Lua提供给你更为强大,也更为灵活的表达方式,在上一种方式中,你无法根据某些条件来配置你的游戏,Lua提供给你灵活的表达方式,你可以类似于这样来配置你的游戏:ifplayer:is_dead()
2、thendo_something()elsedo_else()end更为重要的是,在你做了一些修改之后,完全不需要重新编译你的游戏代码。通常,在游戏中你并不需要一个单独的解释器,你需要在游戏来运行解释器,下面,让我们来看看,如何在你的代码中运行解释器://这是lua所需的三个头文件//当然,你需要链接到正确的lib#include"lua.h"#include"lauxlib.h"#include"lualib.h"intmain(intargc,char*argv[]){lua_State*L=lua_open();luaopen_bas
3、e(L);luaopen_io(L);constchar*buf="print('hello,world!')";lua_dostring(buf);//luaL_dostring(L,buf);原文有问题lua_close(L);return0;}程序输出:hello,world!有时你需要执行一段字符串,有时你可能需要执行一个文件,当你需要执行一个文件时,你可以这么做:lua_dofile(L,"test.lua");看,非常简单吧。在你的游戏中应用Lua(1):GettingValue在上一篇文章我们能够在我们的游戏代码中执行Lua解
4、释器,下面让我们来看看如何从脚本中取得我们所需要的信息。首先,让我来简单的解释一下Lua解释器的工作机制,Lua解释器自身维护一个运行时栈,通过这个运行时栈,Lua解释器向主机程序传递参数,所以我们可以这样来得到一个脚本变量的值:lua_pushstring(L,"var");//将变量的名字放入栈lua_gettatble(L,LUA_GLOBALSINDEX);变量的值现在栈顶假设你在脚本中有一个变量var=100你可以这样来得到这个变量值:intvar=lua_tonumber(L,-1);怎么样,是不是很简单?Lua定义了一个宏让你
5、简单的取得一个变量的值:lua_getglobal(L,name)我们可以这样来取得一个变量的值:lua_getglobal(L,"var");//变量的值现在栈顶intvar=lua_tonumber(L,-1);完整的测试代码如下:#include"lua.h"#inculde"lauxlib.h"#include"lualib.h"intmain(intargc,char*argv[]){lua_State*L=lua_open();luaopen_base(L);luaopen_io(L);constchar*buf="var=10
6、0";lua_dostring(L,buf);//luaL_dostringlua_getglobal(L,"var");intvar=lua_tonumber(L,-1);assert(var==100);lua_close(L);return0;}在你的游戏中应用Lua(1):调用函数假设你在脚本中定义了一个函数:functionmain(number)number=number+1returnnumberend在你的游戏代码中,你希望在某个时刻调用这个函数取得它的返回值。在Lua中,函数等同于变量,所以你可以这样来取得这个函数:lua
7、_getglobal(L,"main");//函数现在栈顶#definelua_getglobal(L,s)lua_getfield(L,LUA_GLOBALSINDEX,(s))#defineLUA_GLOBALSINDEX(-10002)取表中的元素voidlua_getfield(lua_State*L,intindex,constchar*k)操作:arr=Stack[index]//arr肯定是表Stack.push(arr[k])取表中键为k的元素,这里的表是由index指向的栈上的一个表无返回值栈高度+1,栈顶元素是(Stac
8、k[index])[k]注意,该操作将触发__index元方法现在,我们可以调用这个函数,并传递给它正确的参数:lua_pushnumber(L,100);//将参数压栈lua_