cocos2d-x + lua 处理触屏事件

来源:互联网 发布:吉林大学网络教育学费 编辑:程序博客网 时间:2024/05/16 18:33
(1)  使用方法如下  
local function onTouchBegan(x, y)endlocal function onTouchMoved(x, y)endlocal function onTouchEnded(x, y)endlocal function onTouch(eventType, x, y)    if eventType == "begin" then        return onTouchBegan(x, y)    elseif eventType == "moved" CCTOUCHMOVED then        return onTouchMoved(x, y)    else        return onTouchEnded(x, y)    endend--注册触摸函数layer:registerScriptTouchHandler(onTouch)--设置成可触摸layer:setIsTouchEnabled(true)

(2)原理如下

 

一,其实就是在touch事件派发到layer的时候执行一个lua的函数。

这个函数也就是

 local function onTouch(eventType, x, y)
    if eventType == "begin" then
        return onTouchBegan(x, y)
    elseif eventType == "moved" CCTOUCHMOVED then
        return onTouchMoved(x, y)
    else
        return onTouchEnded(x, y)
    end
end

二,在cclayer中注册此函数

layer:registerScriptTouchHandler(onTouch)

void CCLayer::registerScriptTouchHandler(int nHandler, bool bIsMultiTouches, int nPriority, bool bSwallowsTouches){    unregisterScriptTouchHandler(); //将函数名注册到CCTouchScriptHandlerEntry中    m_pScriptTouchHandlerEntry = CCTouchScriptHandlerEntry::create(nHandler, bIsMultiTouches, nPriority, bSwallowsTouches);    m_pScriptTouchHandlerEntry->retain();}

三,当cclayer响应ccTouchBegin时,有如下代码

  if (kScriptTypeNone != m_eScriptType) 
  {      //如果使用了脚本语言,就解析上面注册的ScriptTouchHandler
    return excuteScriptTouchHandler(CCTOUCHBEGAN, pTouch) == 0 ? false : true;
  }

  excuteScriptTouchHandler调用了executeLayerTouchEvent解析lua函数

四,执行lua函数

int CCLuaEngine::executeLayerTouchEvent(CCLayer* pLayer, int eventType, CCTouch *pTouch){    CCTouchScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptTouchHandlerEntry();    if (!pScriptHandlerEntry) return 0;    //从CCTouchScriptHandlerEntry取得函数名    int nHandler = pScriptHandlerEntry->getHandler();    if (!nHandler) return 0;        switch (eventType)    {        case CCTOUCHBEGAN:            m_stack->pushString("began");            break;                    case CCTOUCHMOVED:            m_stack->pushString("moved");            break;                    case CCTOUCHENDED:            m_stack->pushString("ended");            break;                    case CCTOUCHCANCELLED:            m_stack->pushString("cancelled");            break;                    default:            return 0;    }        const CCPoint pt = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());    m_stack->pushFloat(pt.x);    m_stack->pushFloat(pt.y);    //解析函数,传递了3个参数,分别是eventType,x,y    int ret = m_stack->executeFunctionByHandler(nHandler, 3);    m_stack->clean();    return ret;}这样就完成了触屏事件在lua中的处理
原创粉丝点击