在游戏中如何使用LUA脚本语言
当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息。
是的,或许你认为这样就足够了,为什么还要使用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脚本语言--安装.汉化与小测试 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: Lua 是一种轻量小巧的脚本语言,用 ...
- 游戏中使用LUA脚本语言的简介
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 我们知道 ...
- Java中使用LUA脚本语言
Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ieru ...
- java lua脚本_请问该如何在Java中使用Lua脚本语言?
如何在Java中使用Lua脚本语言是本文要介绍的内容,主要是来学习LUA脚本语言在JAVA中如何来使用,Lua就不说了, 现在比较热门, 语法也很简单. 为了在Java中调用, 折腾了比较长的时间, ...
- java lua_请问该如何在Java中使用Lua脚本语言?
大话西游666 如何在Java中使用Lua脚本语言是本文要介绍的内容,主要是来学习LUA脚本语言在JAVA中如何来使用,Lua就不说了, 现在比较热门, 语法也很简单. 为了在Java中调用, 折腾了 ...
- java lua_如何在Java中使用Lua脚本语言
展开全部 如何在Java中使用Lua脚本语言是本文要介32313133353236313431303231363533e59b9ee7ad9431333335343933绍的内容,主要是来学习LUA脚 ...
- java lua脚本_Java中使用LUA脚本语言
Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ieru ...
- fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本
一直觉得大部分的FC/NES模拟器的作弊码金手指不是那么方便使用, 比如魂斗罗1代, 玩家的武器可以通过修改0xAA的值来改变: 0x11为M弹(重机枪),0x12为F弹(圈圈),0x13为S弹(散弹 ...
最新文章
- ess用户名和密码_陈ess洁如何从摄影系学生转变为成功的自由职业者和内容创作者(播客)...
- 阿里云面向企业效率的云上产品全解析——云呼叫中心
- fedora14 an mysql_Fedora 14下 MySQL 更改密码
- 复制活动记录记录的最简单方法是什么?
- window下使用rtl-sdr和sdrsharp
- c语言如何查找字符串指定字符
- leetcode647. 回文子串(动态规划)
- 借助云开发轻松实现后台数据批量导出丨实战
- 别再拿div+css误导人了
- 只有它才能让云计算、大数据、人工智能大放异彩?它究竟有什么魔力?
- inDesign 教程,如何复制文本格式?
- How fast is a C++ extension by the PHP-CPP liberary?
- 最小二乘法求回归直线方程的详细推导过程
- python取下标_python获取下标
- 学习webworker
- 统一网络存储NAS+SAN=FAS
- 网络通信详解-深入浅出
- 实战案例!用 Python 绘制全国鸿星尔克门店分布图,最多的是你所在城市吗?
- 曲面的渐近方向和共轭方向、主方向、曲率线网
- ThreadLocal 是什么?有哪些使用场景?
热门文章
- Python xlrd将excel表的指定数据copy到另一个excel表格中
- 游戏架构 游戏架构设计(15)
- Geocomputation (3)Spatial data operations
- Dota英雄装备配置(转)
- 2022王者荣耀520皮肤有哪些 王者荣耀520皮肤盘点
- 可穿戴设备电商第一家戴极客商城上线,创新模式引瞩目
- 【STM32F407】第8章 学习USB协议栈前要了解的基础知识
- 从零开始C语言精讲篇5:指针
- 和平精英android怎么写符号,和平精英特殊符号怎么打 和平精英名字特殊符号怎么弄的...
- 周六想和女友浪不知道怎么选酒店?Python告诉你全国著名高校附近酒店评论!...