转自:http://firedragonpzy.iteye.com/blog/1622569
刚刚开始学习coocs2d-x的时候,被这个事件的优先级整的可是够呛啊。关于事件,有CCStandradTouch,CCTargetedTouch。CCTouchDispatcher类分发S获取的触摸事件。它有两种分发方式,一种是CCStandardTouchDelegate,一种是CCTargetedTouchDelegate。和前面的事件一一对应,前者将所有的Touch信息直接传递给实现该协议的对象,而后者则要求实现该代理的类一次只能处理一个事件,并且吃掉该事件,不再传播,当然也可以设置传播。
关于CCStandardTouchDelegate,它可以处理多触点事件,而CCTargetedTouchDelegate也就是相应的单点事件喽。
使用单点事件,基本都会用到下面的代码:
void DialogLayer::onEnter()
{
CCLayerColor::onEnter();
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true);
}
void DialogLayer::onExit()
{
CCLayerColor::onExit();
CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);
}
最主要的就是CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true);中的第三个参数,若为true,则表明吞掉事件,若为false,不吞掉事件,个人感觉和目标事件是一样的,只不过是单点,而不是多点而已。写完这个,相应的肯定会使用到下面的代码:
bool DialogLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
return true;
}
void DialogLayer::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
{
}
void DialogLayer::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
}
ccTouchBegan中的return true,表明拥有对象处理权,这个返回值是和CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true);的第三个参数息息相关的若为true,ccTouchBegan也为true,会吞掉事件,走接下来的move等。若ccTouchBegan为false,则不会吞掉事件,各个层被分发点击事件,但是不走move等方法。
不对啊 ,扯远了,本来是说优先级的。先说优先级:
拿精灵来举例子吧。精灵触摸事件的触发是根据添加的顺序依次触发的,后添加的精灵先捕获触摸事件,当然,这是没有设置事件优先级的情况下,若要是定义了事件的优先级,则先按照事件的优先级依次被触发,然后根据添加的顺序依次被触发,特别注意在使用CCMenu的时候,容易出现错误,之前我就是怎么点击也不触发事件,纠结了好久,希望看了本文的朋友们,不会出现此低级错了
乱啊 ,工作了一天在写,脑子有点钝了,见谅,呼呼……