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