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

来源:互联网 发布:java网络高级编程 编辑:程序博客网 时间:2024/05/01 11:24

版本: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是一样的。


0 0
原创粉丝点击