Cocos2d-x之回调Lua的函数

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()          -- 取消注册