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燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP