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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值