GameDesign 板


LINE

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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP