Cocos2d-x Lua實現從Android回調到Lua的方法

最近在研究怎麼把積分牆嵌入到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日誌也被輸出出來了:

圖片描述

相關文章
相關標籤/搜索