1.1 創建LuaHandler.h,方便其實控件增加該功能。
#ifndef __LUAHANDLER_H__
#define __LUAHANDLER_H__
#include "CCLuaEngine.h"
class LuaHandler
{
public:
LuaHandler(): m_nLuaHandler(0){}
virtual ~LuaHandler(){}
// 註冊Lua回調函數
virtual void registerLuaHandler(int nHandler)
{
unregisterLuaHandler();
m_nLuaHandler = nHandler;
LUALOG("[LUA] Add lua handler: %d", m_nLuaHandler);
}
// 取消註冊
virtual void unregisterLuaHandler(void)
{
if (m_nLuaHandler != 0)
{
cocos2d::CCScriptEngineManager::sharedManager()
->getScriptEngine()
->removeScriptHandler(m_nLuaHandler);
m_nLuaHandler = 0;
LUALOG("[LUA] Remove lua handler: %d", m_nLuaHandler);
}
}
// 獲取在Lua中註冊的Lua回調函數引用
int getLuaHandler() { return m_nLuaHandler; };
// 獲取Lua的堆,方法調用各種函數
cocos2d::CCLuaStack *getLuaStack(void)
{
cocos2d::CCLuaEngine *pEngine = (cocos2d::CCLuaEngine*)
(cocos2d::CCScriptEngineManager::sharedManager()->getScriptEngine());
return pEngine->getLuaStack();
}
protected:
int m_nLuaHandler;
};
#endif
1.2 使用LuaHandler.h
#include "LuaHandler.h"
class MyLayer: public CCLayer, public LuaHandler
{
public:
// ... 省略
void callback(void)
{
int mHandler = getLuaHandler();
if (mHandler != 0)
{
CCLuaStack *pStack = getLuaStack();
pStack->pushInt(1234); // 回調函數第一個參數
pStack->pushString("abc"); // 回調函數第二個參數
pStack->executeFunctionByHandler(mHandler, 2); // 2表示回調函數有兩個參數
}
}
};
1.3 創建MyLayer.pkg
class MyLayer: public CCLayer
{
// ... 省略
void registerLuaHandler(LUA_FUNCTION mHandler);
void unregisterLuaHandler(void);
};
local function callback(f, t)
cclog("第一個參數:" .. f .. ",第二個參數:" .. t)
end
local myLayer = MyLayer:create()
myLayer:registerLuaHandler(callback) -- 註冊回調函數
myLayer:unregisterLuaHandler() -- 取消註冊