我们知道脚本语言是解除硬编码,防止重编译的利器,可以这样说,任何大型游戏都有自己的脚本系统。
想要做出一款精品游戏,脚本语言也是我们需要掌握和运用的。
较流行的脚本语言有Python,LUA,Ruby等。
LUA有着轻量,高效,接口干净等特点,学起来很快,风靡全球的《魔兽争霸3:冰封王座》就是采用的LUA脚本语言。
以下的内容非我原创,前几天发现了这篇文章,觉得总结得不错,于是我觉得偷下懒,省得自己总结,直接转载过来供大家学习了。原文地址http://blog.csdn.net/b2b160/article/details/4799302,我将内容进行了排版,代码进行了高亮显示,更方便大家观看了。
应用于“配置”这个目的,Lua提供给你更为强大,也更为灵活的表达方式,在上一种方式中,你无法根据某些条件来配置你的游戏,Lua提供给你灵活的表达方式,你可以类似于这样来配置你的游戏:
if player:is_dead() then do_something() else do_else() end
//这是lua所需的三个头文件 //当然,你需要链接到正确的lib extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } int main(int argc, char *argv[]) { lua_State *L = lua_open(); // 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L); luaopen_base(L); luaopen_io(L); const char *buf = "print('hello, world!')"; // 记住,当你使用的是5.1版本以上的Lua时请使用luaL_dostring(L,buf); lua_dostring(buf); lua_close(L); return 0; }
取得信息
lua_pushstring(L, "var"); //将变量的名字放入栈 lua_gettatbl(L, LUA_GLOBALSINDEX);变量的值现在栈顶
你可以这样来得到这个变量值:
int var = lua_tonumber(L, -1);
lua_getglobal(L, name)
我们可以这样来取得一个变量的值:
lua_getglobal(L, "var"); //变量的值现在栈顶 int var = lua_tonumber(L, -1);
完整的测试代码如下:
#include "lua.h" #inculde "lauxlib.h" #include "lualib.h" int main(int argc, char *argv[]) { lua_State *L = lua_open(); // 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L); luaopen_base(L); luaopen_io(L); const char *buf = "var = 100"; lua_dostring(L, buf); lua_getglobal(L, "var"); int var = lua_tonumber(L, -1); assert(var == 100); lua_close(L); return 0; }
调用函数
function main(number) number = number + 1 return number end
lua_getglobal(L, "main");//函数现在栈顶
lua_pushnumber(L, 100); //将参数压栈 lua_pcall(L, 1, 1, 0); //调用函数,有一个参数,一个返回值 //返回值现在栈顶 int result = lua_tonumber(L, -1);
#include "lua.h" #include "lauxlib.h" #include "lualib.h" int main(int argc, char *argv[]) { lua_State *L = lua_open(); // 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下这句为luaL_openlibs(L); luaopen_base(L); const char *buf = "function main(number) number = number + 1 return number end"; lua_dostring(buf); lua_getglobal(L, "main"); lua_pushnumber(L, 100); lua_pcall(L, 1, 1, 0); int result = lua_tonumber(L, -1); assert(result == 101); lua_close(L); return 0; }
int foo(lua_State *L) { //首先取出脚本执行这个函数时压入栈的参数 //假设这个函数提供一个参数,有两个返回值 //get the first parameter const char *par = lua_tostring(L, -1); printf("%s/n", par); //push the first result lua_pushnumber(L, 100); //push the second result lua_pushnumber(L, 200); //return 2 result return 2; } 我们可以在脚本中这样调用这个函数 r1, r2 = foo("hello") print(r1..r2)
extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } int foo(lua_State *L) { //首先取出脚本执行这个函数时压入栈的参数 //假设这个函数提供一个参数,有两个返回值 //get the first parameter const char *par = lua_tostring(L, -1); printf("%s/n", par); //push the first result lua_pushnumber(L, 100); //push the second result lua_pushnumber(L, 200); //return 2 result return 2; } int main(int argc, char *argv[]) { lua_State *L = lua_open(); // 此处记住,当你使用的是5.1版本以上的Lua时,请修改以下两句为luaL_openlibs(L); luaopen_base(L); luaopen_io(L); lua_register(L, "foo", foo); const char *buf = "r1, r2 = foo("hello") print(r1..r2)"; lua_dostring(L, buf); lua_close(L); return 0; }
程序输出:
hello