lua游戏脚本集成到游戏
① 求教,下载的LUA格式脚本文件怎样用到游戏里。
和txt一一样,lua也是文本文件. 不信,你可以打开一个txt文件,然后把lua文件拖到打开的txt里面,你就可以看到lua的代码了.
② 为什么将lua作为游戏脚本
就我个人的理解来看,使用LUA作为脚本语言有三个好处:
1、轻量级
LUA只包括一个精简的核心和最基本的库。这使得LUA体积小、启动速度快,从而适合嵌入在别的程序里。
2、可配置性、可扩展性
LUA并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。但是LUA可以很容易地被扩展:由宿主语言(通常是C或C++)提供这些功能,LUA可以使用它们,就像是本来就内置的功能一样。
3、兼容性
LUA由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。
这些都是LUA本身所具备的一些特质。而这些特质正好就决定了LUA的广泛使用:
1、轻量级
没人希望自己的应用程序需要附加几十M甚至几百M的库类文件才能运行。如果一个应用程序这么做了,那么它很难做到Run Anywhere。当然,这个Run Anywhere只是这么一说。
2、可配置性、可扩展性
在游戏研发的过程中,修改是必不可少的过程。如果每次修改都需要从底层做起,那必定是一个非常繁琐的过程。而LUA的可配置、扩展正好可以解决这一问题。
3、兼容性
游戏只是游戏,不能决定玩家的机器配置,更不能决定玩家的操作系统。如果因为游戏与用户的操作系统不兼容导致游戏销量下降,我想,这肯定是不被允许的。
所以,具备了以上三个特点的LUA,没有不作为游戏脚本使用的理由。
③ 关于Lua 如何写游戏脚本。。比如我要实现一个窗口或者某一个功能,怎么添加
lua是嵌入式语言,不能独立完成游戏开发,所谓用lua开发游戏,都是基于用lua做脚本的游戏引擎或者自己实现与宿主的绑定
④ 如何在C 中集成LUA脚本
1. 调用Lua脚本
// 创建Lua解释器:
LuaStateOwner state;
// 执行Lua脚本:
state->DoString("print('Hello World/n')");
// 载入Lua脚本文件并执行:
state->DoFile("C://test.lua");
// 载入编译后的Lua脚本文件并执行:
state->DoFile("C://test.luac");
2. 与Lua脚本互相调用
// 为Lua脚本设置变量
state->GetGlobals().SetNumber("myvalue", 123456);
// 获得Lua变量的值
int myvalue = state->GetGlobal("myvalue").GetInteger();
// 调用Lua函数
LuaFunction<int> luaPrint = state->GetGlobal("print");
luaPrint("Hello World/n");
// 让Lua调用C语言函数
int add(int a, int b){ return a+b;}
state->GetGlobals().RegisterDirect("add", add);
state->DoString("print(add(3,4))");
// 让Lua调用C++类成员函数
class Test{public: int add(int a, int b){return a+b;}};
Test test;
state->GetGlobals().RegisterDirect("add", test, add);
state->DoString("print(add(3,4))");
3. 在Lua脚本中使用C++类
这个稍微有点小麻烦。不过,我包装了一个LuaPlusHelper.h的文件,它可以很轻松的完成这个工作。它的实现也很简单,大家可以从源码上来获得如何用纯LuaPlus实现同样的功能。
不过,这里仍然有一个限制没有解决:不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。
另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。
// 下面是一个简单的C++类:
class Logger
{
public:
void LOGMEMBER(const char* message)
{
printf("In member function: %s/n", message);
}
Logger()
{
printf("Constructing(%p).../n", this);
v = 10;
}
virtual ~Logger()
{
printf("Destructing(%p).../n", this);
}
Logger(int n)
{
printf(" -- Constructing[%d](%p).../n", n, this);
}
Logger(Logger* logger)
{
printf(" -- Constructing[%p](%p).../n", logger, this);
logger->LOGMEMBER(" Call From Constructor/n");
}
int SetValue(int val)
{
v = val;
}
int GetValue()
{
return v;
}
public:
int v;
};
// 导入到Lua脚本:
LuaClass<Logger>(state)
.create("Logger") // 定义构造函数 Logger::Logger()
.create<int>("Logger2") // 定义构造函数 Logger::Logger(int)
.create<Logger*>("Logger3") // 定义构造函数 Logger::Logger(Logger*)
.destroy("Free") // 定义析构函数 Logger::~Logger()
.destroy("__gc") // 定义析构函数 Logger::~Logger()
.def("lm", &Logger::LOGMEMBER) // 定义成员函数 Logger::LOGMEMBER(const char*)
.def("SetValue", &Logger::SetValue)
.def("GetValue", &Logger::GetValue);
// 在Lua中使用Logger类(1):
state->DoString(
"l = Logger();" // 调用构造函数 Logger::Logger()
"l.lm('Hello World 1');" // 调用成员函数 Logger::LOGMEMBER(const char*)
"l.Free();" // 调用析构函数 Logger::~Logger()
);
// 在Lua中使用Logger类(2):
state->DoString(
"m = Logger(10);" // 调用构造函数 Logger::Logger(int)
"m.lm('Hello World 2');" // 调用成员函数 Logger::LOGMEMBER(const char*)
"n = Logger(m);" // 调用构造函数 Logger::Logger(Logger*)
"n.lm('Hello World 3');" // 调用成员函数 Logger::LOGMEMBER(const char*)
"m.SetValue(11);"
"print(m.GetValue());"
"m,n = nil, nil;" // m,n 将由Lua的垃极回收来调用析构函数
);
4. 将一组C函数归类到Lua模块
//同上面一样,我采用LuaPlusHelper.h来简化:
LuaMole(state, "mymole")
.def("add", add)
.def("add2", test, add);
state->DoString(
"print(mymole.add(3,4));"
"print(mymole.add2(3,4));"
);
5. 使用Lua的Table数据类型
// 在Lua中创建Table
LuaObject table = state->GetGlobals().CreateTable("mytable");
table.SetInteger("m", 10);
table.SetNumber("f", 1.99);
table.SetString("s", "Hello World");
table.SetWString("ch", L"你好");
table.SetString(1, "What");
// 相当于Lua中的:
// mytable = {m=10, f=1.99, s="Hello World", ch=L"你好", "What"}
// 也可以使用table作为key和value:
state->GetGlobals().CreateTable("nexttable")
.SetString(table, "Hello")
.SetObject("obj", table);
// 相当于Lua中的:
// nexttable = {mytable="Hello", obj=mytable}
//获得Table的内容:
LuaObject t2 = state->GetGlobals("mytable");
int m = t2.GetByName("m").GetInteger();
LuaObject t3 = state->GetGlobals("nexttable");
std::string str = t3.GetByObject(t2).GetString();
6 遍历Table
LuaStateOwner state;
state.DoString( "MyTable = { Hi = 5, Hello = 10, Yo = 6 }" );
LuaObject obj = state.GetGlobals()[ "MyTable" ];
for ( LuaTableIterator it( obj ); it; it.Next() )
{
const char* key = it.GetKey().GetString();
int num = it.GetValue().GetInteger();
}
⑤ Lua为什么在游戏编程领域被广泛运用
用过Lua的都知道,Lua无论在与C/C++数据传递,还是在封装都很方便,API非常简单。同时Lua的许可证和紧凑性(把lib编译进程序即可),都十分利于集成。这些都是Python和V8不能比的。同时,Lua编程学习难度极低。Python虽然容易学,但不简单;javaScript学习难度不够低。实际上,Lua进入游戏业非常早,早在1998年卢卡斯的《异域狂想曲》(Grim Fandango)中,就首次在游戏领域用到了Lua。十年之前着名的游戏博德之门、猴岛4都用了Lua。至少从开源代码来看,云风对Lua的使用是十分重度的,比如skynet的入口是在Lua上。国内很多游戏对Lua的使用很浅,多是把一些需要经常改的运算放出来给Lua做。
⑥ 如何集成Lua实现到Android游戏
在这里我把自己通过整合资料完成的方案写下来,希望能给需要的程序员帮助,欢迎大家提供更快捷的方案。不再赘述Android开发环境的配置以及Lua脚本语言的介绍,需要了解的朋友可以Google资料。
我的开发环境是Window,列举我们将要用到的工具和组件:
Lua用C实现,所以如果我们不打算用Java重写解释器的话,我们需要一种方式使C和Java能良好的沟通,熟悉Java的程序员肯定想到了JNI(Java Native Interface)。你可能在Linux环境和Window环境使用过JNI,过程并不复杂:写好Java文件并在其中声明好native方法→用javah生成C头文件→为C文件中声明的函数写好实现→编译C代码生成动态链接库,这样就可以在Java中使用native方法了。
在Android下我们同样要经过这些步骤,只不过编译生成动态链接库的时候我们需要Google提供的NDK工具。在Window环境下使用NDK还需要安装UNIX模拟环境Cygwin。我们还将用到一个对Lua进行良好封装的开源项目luajava。
⑦ 如何把lua脚本注入到魔兽世界
把lua脚本注入到魔兽世界:
Lua脚本在魔兽世界里的应用不仅限于做宏,做脚本宏,其本质就是编程,只不过在编以魔兽世界为平台和限制的程序,所以要想做出好的脚本宏,根本问题就是建立和提高编程的思维,魔兽世界脚本的限制很大。
在魔兽世界lua的脚本宏中,是用/script [宏语句]来执行宏的,在下面的代码中,就不写整个宏(一个一个在前面加/script)了,直接把宏语句写出来。
赋值语句,在lua编程中,一切都是在处理变量,要定义变量并指定这个变量的值,这个指定变量的值的过程叫做赋值。
[变量名]=[值]这个语句的作用是把变量的值变成[值],如a=1就是把变量a的值指定为1。
[变量名1],[变量名2],[变量名3]……[变量名n]=[值1],[值2],[值3]……[值n]。这个语句相当于[变量名1]=[值1],[变量名2]=[值2],[变量名3]=[值3],[变量名n]=[值n]。比如a,b,c,d,e=14,20,93,61,0相当于a=14,b=20,c=93,d=61,e=0。
条件判断语句,也就是如果什么什么条件成立,就做什么什么事,甚至是否则做什么事。
if [做这件事的条件] then
[要做的事]
end
即如果[做这件事的条件]成立则做[要做的事]
还可以加一个else表示否则做什么事:
if [做这件事的条件] then
[要做的事]
else
[否则做的事]
end
即如果[做这件事的条件]成立则做[要做的事],否则做[否则做的事]
有时需要根据多种情况决定如何做,就会用到elseif:
if [做A事的条件] then
[A事]
elseif [做B事的条件] then
[B事]
else
[否则做的事]
end
⑧ 手游lua脚本怎么用
主要用途是:
(1)描述界面:WOW和剑网三的界面都是用LUA写的;
(2)沟通引擎:游戏图形引擎提供了一些接口库,可以在LUA中调用;
(3)服务器端:有些游戏,例如剑网三,在服务器端也会大量使用LUA。
⑨ 如何用lua制作游戏
LZ要学LUA的话一定要去看书 Programming in Lua不一定要买纸质的 至少要有个电子档的 在序言里就已经说了 Lua本身是作为一种扩展语言来定位的 所以本身没有很强大的库 而它优势在于扩展性和兼容性 大部分功能都必须依赖外部的库 本身只有一些很简单的库函数可供调用 但是作为学习的话 那些强大的库大可不必看 基本的那些库学起来已经需要好一段时间了
至于脚本和C等的调用问题 虽然两者都可相互调用,但是毕竟windows与C相连接更紧密,所以一般来说 都是C调用lua 但是当脚本范肌顿可塥玖舵雪罚磨里需要实现一些需要使用c来写程序的时候也会在lua中调用c
lua脚本和C绑定的问题 c写的VC程序在windows下是可以直接运行的,lua写的如果没有解释器是无法直接运行的 所以一般来说写lua程序 想要直接使用的话都会用C来调用
如果您认可我的答案,。
您的采纳,是我答题的动力,O(∩_∩)O!!