`
bcyy
  • 浏览: 1824547 次
文章分类
社区版块
存档分类
最新评论

游戏中使用LUA脚本语言的简介

 
阅读更多


我们知道脚本语言是解除硬编码,防止重编译的利器,可以这样说,任何大型游戏都有自己的脚本系统。

想要做出一款精品游戏,脚本语言也是我们需要掌握和运用的。

较流行的脚本语言有Python,LUA,Ruby等。

LUA有着轻量,高效,接口干净等特点,学起来很快,风靡全球的《魔兽争霸3:冰封王座》就是采用的LUA脚本语言。




以下的内容非我原创,前几天发现了这篇文章,觉得总结得不错,于是我觉得偷下懒,省得自己总结,直接转载过来供大家学习了。原文地址http://blog.csdn.net/b2b160/article/details/4799302,我将内容进行了排版,代码进行了高亮显示,更方便大家观看了。



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




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


应用于“配置”这个目的,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;
}




程序输出:hello, world!


有时你需要执行一段字符串,有时你可能需要执行一个文件,当你需要执行一个文件时,你可以这么做:
lua_dofile(L, "test.lua");


看,非常简单吧。




取得信息


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



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

lua_pushstring(L, "var"); //将变量的名字放入栈
lua_gettatbl(L, LUA_GLOBALSINDEX);变量的值现在栈顶

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

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

int var = lua_tonumber(L, -1);


怎么样,是不是很简单?


Lua定义了一个宏让你简单的取得一个变量的值:
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中,函数等同于变量,所以你可以这样来取得这个函数:
lua_getglobal(L, "main");//函数现在栈顶



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

lua_pushnumber(L, 100); //将参数压栈
lua_pcall(L, 1, 1, 0); //调用函数,有一个参数,一个返回值
//返回值现在栈顶
int result = lua_tonumber(L, -1);


result 就是函数的返回值


完整的测试代码如下:

#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;
}





脚本调用程序



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



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


Lua定义了一种类型:lua_CFunction,这是一个函数指针,它的原型是:
typedef int (*lua_CFunction) (lua_State *L);


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


首先,我们定义一个函数


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
100200
分享到:
评论

相关推荐

    Lua脚本在游戏引擎中的应用

    Lua是一种免费、开放的中间代码型的脚本语言,作者在研究了它的结构和 特点的基础上,对Lua运行环境中的堆栈结构进行了分析,由于引擎与Lua脚本 均能够操作堆栈中的数据,因此通过把堆栈作为两者信息传递的中间层,...

    游戏引擎以Lua脚本驱动的经典扫雷游戏(加壳版)

    游戏引擎以Lua脚本驱动的经典扫雷游戏 程序介绍: 1、开发环境VC6 2、UI使用MFC 3、绘图使用GDI 4、声音使用mmsystem媒体功能 5、Lua开发包版本lua5.1.4 游戏引擎: 1、Lua程序驱动引擎QLua.dll版本2.0,...

    Lua游戏脚本语言入门

    Lua游戏脚本语言入门

    Lua脚本语言中文教程.pdf

    Lua中文教程 很简单的脚本编程语言 很容易与C/java等语言调用 比如大型游戏的剧情 还有安卓上的愤怒的小鸟便是用Lua写的 虽说是脚本年语言 但这种语言执行效率特别高 而且还特别简单方便

    lua脚本语言详细资料

    lua教程, 包含入门手册以及PPT讲解

    Lua游戏脚本语言入门.doc

    Lua游戏脚本语言入门.doc

    游戏引擎以Lua脚本驱动的经典扫雷游戏

    游戏引擎以Lua脚本驱动的经典扫雷游戏 程序介绍: 1、开发环境VC6 2、UI使用MFC 3、绘图使用GDI 4、声音使用mmsystem媒体功能 5、Lua开发包版本lua5.1.4 游戏引擎: 1、Lua程序驱动引擎QLua.dll版本2.0,支持对Lua...

    LUA5.1 脚本语言 编译执行源码

    Lua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。Lua的每个...

    千年游戏LUA源码脚本幸运宝箱

    LUA源码程序脚本,常见的是物品及数量,这个含有强化等级和升段属性,很实用

    游戏脚本语言lua中文教程

    lua中文教程 很好很强大的游戏脚本语言很值得学习

    lua脚本语言零基础开发教程

    主要讲解的lua基础知识,个人觉得讲的还可以,需要windows电脑才能播放

    2D游戏引擎采用SFML C++库和Lua脚本语言.rar

    2D游戏引擎采用SFML C++库和Lua脚本语言.rar

    lua解密工具.apk

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和网络编程等领域。通过使用该工具,开发者可以对Lua脚本进行反编译、编辑和重新编译,从而实现对Lua脚本的分析和修改。 该工具的主要功能包括: 1. 反编译...

    lua游戏开发实践指南源码

    它完美地展示了在游戏开发和设计中使用Lua的各种技术细节以及常用的方法与技巧,同时包含大量可操作性极强的实例,无论你是有一定Lua基础的游戏开发者,还是Lua的初学者,本书都能让你领略到Lua的强大魅力。

    lua非常好用有用编辑器

    lua 是非常容易使用的脚本语言,也是进行游戏开发的比较常用的脚本语言

    Lua 脚本语言

    众所周知,Lua这个脚本语言被用于游戏的设计,很受游戏开发人员的欢迎,这个压缩包里面包括了<<Programming in Lua>>5.0的中文版和5.1的中文参考手册

    lua脚本语言

    游戏开发脚本语言,最新版。

    Lua飞机大战源码

    Lua飞机大战源码

Global site tag (gtag.js) - Google Analytics