Cocos2d-x的学习 触碰事件老版本和新版本的对比 第四节

    xiaoxiao2025-09-03  371

    版本:cocos2d-x 2.2.2    语言:C++

     

    最近又要高温了,房间里没空调,不开心。

     

    今天主要讲一下使用Lua注册事件的时候,究竟在什么地方设置了两个参数。

     

    首先我要说一下,setTouchEnable之类的方式开启事件处理一般是用在C++中的,而Lua中的两种方法:registerScriptTouchHandler、registerScriptTapHandler,在C++中是无法使用的(高版本C++,listener就够了)。

     

    所以专门针对的就是上述两个方法的注册。首先来看看这个:

     

    这是CCLayer中的触摸事件处理。总之下面一堆就是要求你重写这个方法的,重点是上面四行的代码,excuteScriptTouchHandler,执行触摸的脚本handler。追进去看看:

     

    出现了一个脚本引擎,然后该引擎调用了事件,继续看看:

    int CCLuaEngine::executeLayerTouchEvent(CCLayer* pLayer, int eventType, CCTouch *pTouch) { CCTouchScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptTouchHandlerEntry(); if (!pScriptHandlerEntry) return 0; int nHandler = pScriptHandlerEntry->getHandler(); if (!nHandler) return 0; switch (eventType) //存放了Touch类型 { 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); //存放 x、y坐标 m_stack->pushFloat(pt.y); int ret = m_stack->executeFunctionByHandler(nHandler, 3); m_stack->clean(); return ret; }

    首先前面获取具体的handler,然后在跟Lua交互的栈中存放了Touch的类型,之后把x、y轴的坐标也传递了进去。最后执行了handler处理。

     

    所以让我们来整理一下:

    1.  首先我们开启了CCLayer中的触碰事件;

    2.  然后把handler传递了进去;

    3.  这时候玩家触碰了屏幕,触发了ccTouchBegan等方法,但Lua中没有重写这些方法,一判断有脚本的,就马上交给了CCLuaEngine脚本引擎处理;

    4.  引擎主动传入了触碰类型、坐标这几个参数,最后执行了注册的handler

     

    上述代码是TouchScript的,想必TapScript也大同小异:

     

    搜了一下,这边传入了具体的tag和原本的Object。嗯,这样就解决了。什么?感觉有点怪怪的?

     

    嗯,可能是这点吧。实际上仔细看看上面的代码,TapScript是属于MenuItem的,而TouchScript是属于CCLayer的。

     

    断了个点,追上去:

     

    想必这边也解释了,为什么按下就触碰的原理了。。。而active,主动传入的事件是在TouchEnded中处理的,为什么要这样啊。。。

     

    3.0版本的处理方式跟2.0是一样的。

    转载请注明原文地址: https://ju.6miu.com/read-1302280.html
    最新回复(0)