作者StubbornLin (Victor)
看板GameDesign
标题[程式] Lua教程 : 函数的使用
时间Fri Aug 11 12:33:53 2006
Lua的一个很强大的功能就是可以用C语言扩充,这样一来可以把工作量很大的运算
都用C语言完成,而Lua只要运用就好,除此之外有C语言就可以实现其它有的没有的功能
让Lua变得更强大
现在我们就来介绍Lua呼叫C语言的函式
/////////////////////////////////////////////////
#include <iostream>
extern "C"{
#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
static int SayHello(lua_State *pLua){
const char *Name = lua_tostring(pLua,1); // 取得堆叠底层第一个参数的Name
std::string Hello = "Hello! ";
Hello += Name;
lua_pushstring(pLua, Hello.c_str()); // 推入回传字串进堆叠
return 1; // 告诉Lua我们有一个回传值
}
int main (void) {
// 开启Lua
lua_State *pLua = lua_open();
if(!pLua){
std::cerr << "Failed to open Lua"<< std::endl;
return EXIT_FAILURE;
}
// 启动函式库
luaopen_base(pLua);
luaopen_table(pLua);
luaopen_string(pLua);
luaopen_math(pLua);
luaopen_io(pLua);
lua_register(pLua,"SayHello",SayHello); // 这是下面那两行的简写
//lua_pushcfunction(pLua, SayHello);
//lua_setglobal(pLua, "SayHello");
int Result;
// 载入Lua档
Result = luaL_loadfile(pLua,"hello.lua");
if(Result){
std::cerr << "Failed to load file"<< std::endl;
return EXIT_FAILURE;
}
// 执行整个Lua档
Result =lua_pcall(pLua, 0, 0, 0);
if(Result){
std::cerr << "Failed to run lua"<< std::endl;
return EXIT_FAILURE;
}
lua_close(pLua);
return 0;
}
//////////////////////////////////////////////////////
-- This is my second lua programming
print(SayHello("Victor Lin"))
//////////////////////////////////////////////////////
这次我们只增加了一点点东西,这证明了要增加C语言的函式其实不难,首先
先从我们新增的函数来看
static int SayHello(lua_State *pLua){
const char *Name = lua_tostring(pLua,1); // 取得堆叠底层第一个参数的
Name
std::string Hello = "Hello! ";
Hello += Name;
lua_pushstring(pLua, Hello.c_str()); // 推入回传字串进堆叠
return 1; // 告诉Lua我们有一个回传值
}
要给Lua使用的函数,回传值都是int,接受的参数都是lua_State *
而参数和回传值的部份,都是由Lua的堆叠操作来完成的
第一行 const char *Name = lua_tostring(pLua,1); 就是从Lua的参数堆叠里
取最底层的第1个,如果数字改成2,就变成是数上来的第2个
除此之外,你可以改成-1 -2... 等等,负值的意思,例如-1就是取堆叠最上面的值
-2是最上面往下数1个的值,以此类推
而lua_toxxx的意思,是从堆叠中取出那个值,并且转为xxx形态的意思
其它还有很多形态可以用,在这里我就不多说了,因为官方网站都查得到
除此之外,还有一些确认传来的值正不正确的函数,官网一样也有资料可以查
中间是C语言运作的部份,接下来就是回传值的时後,我们说过Lua是运用堆叠来操作
所以,要回传值,只要把它们push到堆叠里面就成了,而return 1;是告诉lua
我们有一个回传值,会这麽说,就代表Lua可以回传很多个值,你可以Push很多个值
然後return多少个值,Lua就会收到多少个值,但是这边注意一下,
即然是用堆叠,就有空间大小的限制,依我看到的官方堆叠大小好像是20个
以一般的使用情况,20个是不会用完的,所以不用担心,如果用完的话
那我想那应该要算你使用不当,当然,如果你有特殊需求,要改堆叠的大小的话
Lua的表头档里面有常数可以修改,这个部份也比较深入,所以请自行参考官网
接下来是我们在主程式新增的程式码
lua_register(pLua,"SayHello",SayHello); // 这是下面那两行的简写
//lua_pushcfunction(pLua, SayHello);
//lua_setglobal(pLua, "SayHello");
是的,注册一个C函数给Lua就是那麽简单,我们发现可以有两种写法
这是因为Lua提供很多常用的功能以巨集的方式给我们使用,很多地方
只要你会好好使用Lua提供的简写方式,就可以省很多力气
以上,今天的C函数呼叫的部份就到这里
--
VICTOR工作室 |
PTT游戏设计版隆重开幕!
|
不管是新手老手,程式美工音乐企划....
URL :
http://www.kinmen.info/vic/ |
都欢迎来游戏设计版参与讨论 XD
|
战略高手>
C/C++ |
GameTopics>
Visual Basic 6.0 |
GameDesign
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.116.65.59