2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 在游戏中如何使用LUA脚本语言

在游戏中如何使用LUA脚本语言

时间:2020-12-13 11:50:34

相关推荐

在游戏中如何使用LUA脚本语言

当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息。

是的,或许你认为这样就足够了,为什么还要使用Lua呢?

应用于“配置”这个目的,Lua提供给你更为强大,也更为灵活的表达方式,在上一种方式中,你无法根据某些条件来配置你的游戏,Lua提供给你灵活的表达方式,你可以类似于这样来配置你的游戏:

ifplayer:is_dead()then

do_something()

else

do_else()

end

更为重要的是,在你做了一些修改之后,完全不需要重新编译你的游戏代码。

通常,在游戏中你并不需要一个单独的解释器,你需要在游戏来运行解释器,下面,让我们来看看,如何在你的代码中运行解释器:

//这是lua所需的三个头文件

//当然,你需要链接到正确的lib

extern "C"

{

#include"lua.h"

#include"lauxlib.h"

#include"lualib.h"

}

intmain(intargc,char*argv[])

{

lua_State*L=lua_open();

// 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L);

luaopen_base(L);

luaopen_io(L);

constchar*buf="print('hello,world!')";

// 记住,当你使用的是5.1版本以上的Lua时请使用luaL_dostring(L,buf);

lua_dostring(buf);

lua_close(L);

return0;

}

程序输出:hello,world!

有时你需要执行一段字符串,有时你可能需要执行一个文件,当你需要执行一个文件时,你可以这么做:

lua_dofile(L,"test.lua");

看,非常简单吧。

下面让我们来看看如何从脚本中取得我们所需要的信息。

首先,让我来简单的解释一下Lua解释器的工作机制,Lua解释器自身维护一个运行时栈,通过这个运行时栈,Lua解释器向主机程序传递参数,所以我们可以这样来得到一个脚本变量的值:

lua_pushstring(L,"var");//将变量的名字放入栈

lua_gettatbl(L,LUA_GLOBALSINDEX);变量的值现在栈顶

假设你在脚本中有一个变量var=100

你可以这样来得到这个变量值:

intvar=lua_tonumber(L,-1);

怎么样,是不是很简单?

Lua定义了一个宏让你简单的取得一个变量的值:

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();

// 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L);

luaopen_base(L);

luaopen_io(L);

constchar*buf="var=100";

lua_dostring(L,buf);

lua_getglobal(L,"var");

intvar=lua_tonumber(L,-1);

assert(var==100);

lua_close(L);

return0;

}

调用函数

假设你在脚本中定义了一个函数:

functionmain(number)

number=number+1

returnnumber

end

在你的游戏代码中,你希望在某个时刻调用这个函数取得它的返回值。

在Lua中,函数等同于变量,所以你可以这样来取得这个函数:

lua_getglobal(L,"main");//函数现在栈顶

现在,我们可以调用这个函数,并传递给它正确的参数:

lua_pushnumber(L,100);//将参数压栈

lua_pcall(L,1,1,0);//调用函数,有一个参数,一个返回值

//返回值现在栈顶

intresult=lua_tonumber(L,-1);

result就是函数的返回值

完整的测试代码如下:

#include"lua.h"

#include"lauxlib.h"

#include"lualib.h"

intmain(intargc,char*argv[])

{

lua_State*L=lua_open();

// 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下这句为luaL_openlibs(L);

luaopen_base(L);

constchar*buf="functionmain(number)number=number+1returnnumberend";

lua_dostring(buf);

lua_getglobal(L,"main");

lua_pushnumber(L,100);

lua_pcall(L,1,1,0);

intresult=lua_tonumber(L,-1);

assert(result==101);

lua_close(L);

return0;

}

脚本调用程序

Lua本身定位在一种轻量级的,灵活的,可扩充的脚本语言,这意味着你可以自由的扩充Lua,为你自己的游戏量身定做一个脚本语言。

你可以在主机程序中向脚本提供你自定的api,供脚本调用。

Lua定义了一种类型:lua_CFunction,这是一个函数指针,它的原型是:

typedefint(*lua_CFunction)(lua_State*L);

这意味着只有这种类型的函数才能向Lua注册。

首先,我们定义一个函数

intfoo(lua_State*L)

{

//首先取出脚本执行这个函数时压入栈的参数

//假设这个函数提供一个参数,有两个返回值

//getthefirstparameter

constchar*par=lua_tostring(L,-1);

printf("%s/n",par);

//pushthefirstresult

lua_pushnumber(L,100);

//pushthesecondresult

lua_pushnumber(L,200);

//return2result

return2;

}

我们可以在脚本中这样调用这个函数

r1,r2=foo("hello")

print(r1..r2)

完整的测试代码如下:

extern "C"

{

#include"lua.h"

#include"lauxlib.h"

#include"lualib.h"

}

intfoo(lua_State*L)

{

//首先取出脚本执行这个函数时压入栈的参数

//假设这个函数提供一个参数,有两个返回值

//getthefirstparameter

constchar*par=lua_tostring(L,-1);

printf("%s/n",par);

//pushthefirstresult

lua_pushnumber(L,100);

//pushthesecondresult

lua_pushnumber(L,200);

//return2result

return2;

}

intmain(intargc,char*argv[])

{

lua_State*L=lua_open();

// 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L);

luaopen_base(L);

luaopen_io(L);

lua_register(L,"foo",foo);

constchar*buf="r1,r2=foo("hello")print(r1..r2)";

lua_dostring(L,buf);

lua_close(L);

return0;

}

程序输出:

hello

100200

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。