最近在研究怎麼把積分牆嵌入到Cocos2d-x Lua
的裏,折騰了幾天,總算調通了,主要要解決的問題是,調用積分牆以後,當積分發生改變的時候,有一個回調方法,回調會返回用戶還剩下多少積分,當Android
收到這個回調的時候,須要把這個通知給lua
作對應的處理,我就是在這裏卡住了。android
先理一下思路要實現上面提到的回調通知lua
,首先要實現Android
回調給C++
,再從C++
去調用Lua
的方法。函數
一步一步來,先看Android
端的回調方法,當有積分變化的時候,onPointBalanceChange
方法會被觸發:測試
onPointBalanceChange
方法裏用到了一個pointsBalanceChange()
的方法,這個方法在下面被定義成了本地函數,經過本地函數,來調用C++的代碼lua
再看在C++
的裏的代碼:spa
先判斷是Android的狀況下再進行下一步處理
而後寫一個方法,這個方法的方法名圖上已經有詳細說明了調試
void Java_org_cocos2dx_lua_AppActivity_pointsBalanceChange( JNIEnv *env,jobject thiz,jint point ){}
到如今爲止,不出意外的話,編譯應該會經過,而且能夠用真機運行調試,當Android
裏的積分變化回調方法被觸發的時候,對應到C++
裏的方法也會被觸發,而且輸出CCLog
裏的內容日誌
若是這一步你調試通了,那就表示從Android到C++的調用調通了,接下來再看C++怎麼調用lua,須要在剛纔的基礎上添加一些配置:code
一、先添加了:對象
//把LuaEngine include進來以後,下面會用到這個 #include "CCLuaEngine.h"
二、在Java_org_cocos2dx_lua_AppActivity_pointsBalanceChange
方法裏添加一大堆東西,我挨個解釋一下(有的我也不太明白,有錯誤請指正)blog
//這兩個我是沒太明白,大概意思是獲得一個能夠和lua鏈接的對象 auto engine = LuaEngine::getInstance()->getLuaStack(); lua_State *state = engine->getLuaState();
//經過這個方法去查找lua函數,並壓入棧底,pointsBalanceChange是在lua定義的一個function lua_getglobal(state, "pointsBalanceChange");
//pointsBalanceChange須要接受一個參數,這裏把Android獲得的積分數據,傳入給這個function engine->pushInt(point);
//調用pointsBalanceChange函數,第二個參數表示有多少參數,第三個表示有多少個返回值,第四個參數設置成0表示若是出錯了,直接輸出原始的錯誤信息,具體的沒太明白,後續在研究 lua_pcall(state, 1, 0, 0);
//調用完成後清棧,第二個參數爲從堆棧中彈出的返回值,由於沒有返回值因此設置爲0 lua_pop(state, 0);
到這裏,C++
的代碼都寫完了,接下來須要在lua
下的main.lua
裏實現一個pointsBalanceChange
方法,接受一個參數,在這個方法裏輸出一下獲得的point:
都完成了,這個時候編譯一下:
cocos compile -p android
不出意外是沒問題的,而後真機測試,當Android的回調函數被觸發的時候對應的Lua裏的cclog日誌也被輸出出來了: