Lua中調(diào)用C++函數(shù)實(shí)例
到這為止,大家對(duì)Lua和C++之間的通信應(yīng)該有些熟悉了,今天我們來介紹最后一個(gè)操作。
(旁白:什么?最后一個(gè)?要結(jié)束了么?太好了~?。?/p>
上一章傳送門:http://www.dbjr.com.cn/article/55097.htm
1. Lua調(diào)用C++的函數(shù)
Lua要調(diào)用C++的函數(shù)還是蠻方便的,首先,我們來創(chuàng)建一個(gè)c++函數(shù)先:
public:
static int getNumber(int num);
int HelloLua::getNumber( int num ) {
CCLOG("getNumber num = %d", num);
return num + 1;
}
類的什么的,我就忽略了,直接上函數(shù)。
(旁白:= =好懶!)
這是一個(gè)很簡(jiǎn)單的函數(shù),給出一個(gè)值,返回一個(gè)+1后的值。
現(xiàn)在,我們想在Lua中調(diào)用這個(gè)函數(shù),得多寫一個(gè)函數(shù)。
(旁白:那個(gè),為嘛getNumber函數(shù)是靜態(tài)的?)
public:
static int cpp_GetNumber(lua_State* pL);
int HelloLua::cpp_GetNumber( lua_State* pL ) {
/* 從棧頂中取一個(gè)值 */
int num = (int)lua_tonumber(pL, 1);
/* 調(diào)用getNumber函數(shù),將返回值入棧 */
lua_pushnumber(pL, getNumber(num));
/* 返回值個(gè)數(shù),getNumber只有一個(gè)返回值,所以返回1 */
return 1;
}
(旁白:又是靜態(tài)的!)
這是怎么回事呢?我們很清楚,Lua和C++只能通過堆棧通信,所以Lua是不可能直接調(diào)用getNumber函數(shù)的,所以我們建立一個(gè)cpp_GetNumber函數(shù)作為中介。
cpp_GetNumber函數(shù)有一個(gè)lua_State* pL參數(shù),有了這個(gè)參數(shù),c++就能從Lua的堆棧中取值了,剩下的都很簡(jiǎn)單,不想過多的解釋…
還是解釋一下吧。
(旁白:你妹紙的,我就知道!)
1) 首先,Lua腳本里會(huì)調(diào)用cpp_GetNumber函數(shù),至于為什么能調(diào)用,一回解釋,我知道旁白一定會(huì)問的。(旁白:有種無力吐槽的感覺。。。)
2) 當(dāng)cpp_GetNumber被調(diào)用時(shí),一切又回到C++對(duì)Lua的操作了,棧頂里會(huì)存放函數(shù)所需要的參數(shù),取出來用就可以的。
3) Lua調(diào)用cpp_GetNumber之后,需要一個(gè)結(jié)果,當(dāng)然,這個(gè)結(jié)果同樣只能存放在棧里,所以理所當(dāng)然地要把getNumber的結(jié)果入棧。
4) 最后,cpp_GetNumber return了一個(gè)值,這個(gè)值不是函數(shù)的執(zhí)行結(jié)果,而是getNumber需要返回值的個(gè)數(shù)(Lua支持多個(gè)返回值的函數(shù))
旁白,你明白了么?
(旁白:額。。。沒明白)
好,既然大家都明白了,我就不多說了~
(旁白:你妹紙的O O?。?br />
2. 結(jié)束了
最后,關(guān)于Lua的教程,到此告一段落了,本來我還想寫寫LuaBind的教程的(非常強(qiáng)大!)。但是,寫教程是一件很耗時(shí)的工作,10分鐘能學(xué)會(huì)的知識(shí),也許我要花2個(gè)小時(shí)才能誕生一篇教程。(旁白:好吧,所以大家多些支持他吧。。。)
不過,如果大家把這6篇教程吃透,然后再去用Lua在Cocos2d-x里開發(fā),就沒什么大的難度了。(最好再去了解一下LuaBind)
或許,我以后會(huì)接著寫Lua的教程,而現(xiàn)在,我要繼續(xù)學(xué)習(xí)Cocos2d-x去了~因?yàn)閷懡坛痰木壒剩ㄟ@兩周一直在寫狀態(tài)機(jī)的教程以及Lua的教程),我停止了接近兩周的時(shí)間。得抓緊了~不能落后~
那么,祝大家元旦快樂。
(旁白:你確定你元旦之后會(huì)發(fā)這篇教程么?)
然后,希望大家輕輕地動(dòng)一下鼠標(biāo),點(diǎn)一下“頂”~嘿嘿
相關(guān)文章
Linux下編寫Lua擴(kuò)展so文件和調(diào)用方法實(shí)例
這篇文章主要介紹了Linux下編寫Lua擴(kuò)展so文件和調(diào)用方法實(shí)例,本文給出C語言代碼、編譯SO文件、Lua中調(diào)用代碼實(shí)例,需要的朋友可以參考下2015-05-05Lua中實(shí)現(xiàn)面向?qū)ο蟮囊环N漂亮解決方案
這篇文章主要介紹了Lua中實(shí)現(xiàn)面向?qū)ο蟮囊环N漂亮解決方案,本文給出實(shí)現(xiàn)代碼、使用方法及代碼分析,需要的朋友可以參考下2015-01-01