cocos2d-x事件觸發的優先順序

firedragonpzy發表於2012-08-06
[i][b]本文為firedragonpzy原創,轉載務必在明顯處註明:
轉載自【Softeware MyZone】原文連結: http://www.firedragonpzy.com.cn/index.php/archives/858[/b][/i]

   剛剛開始學習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的時候,容易出現錯誤,之前我就是怎麼點選也不觸發事件,糾結了好久,希望看了本文的朋友們,不會出現此低階錯了
亂啊 ,工作了一天在寫,腦子有點鈍了,見諒,呼呼……


詳細請參考: 【Software MyZne】[url]http://www.firedragonpzy.com.cn/index.php/archives/858 [/url]

相關文章