欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

cocos2d-x事件触发的优先级

本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接: http://www.firedragonpzy.com.cn/index.php/archives/858

刚刚开始学习coocs2d-x的时候,被这个事件的优先级整的可是够呛啊。关于事件,有CCStandradTouch,CCTargetedTouch。CCTouchDispatcher类分发获取的触摸事件。它有两种分发方式,一种是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的时候,容易出现错误,之前我就是怎么点击也不触发事件,纠结了好久,希望看了本文的朋友们,不会出现此低级错了
乱啊 ,工作了一天在写,脑子有点钝了,见谅,呼呼……

更多请阅读:http://article.ityran.com/archives/1326(泰然)

发表评论