iphone開發筆記——Cocos2d CCLayer中的touch

廢話不多說,cocos2d 自帶有兩套協議 分別是CCTargetedTouchDelegate 和 CCStandardTouchDelegate

這兩個都是處理touch inside 但是針對點不同, CCTargeted...這個協議針對單點觸控,用戶直接操作UITouch

而Standard 傳入的是一個NSSet  裏面是 當前屏幕觸摸的每個觸摸點的UITouch ,恩最多是十個吧。。

 

那麼 target的好處在哪裏,standard 完全可以 解決掉所有情況纔對吖。

其實不是這樣的,先說一下cocos2d 的touch inside 傳輸機制

 

如果一個東西 想用 touch 協議,那麼 除了 在頭文件中寫上 我使用這個協議 以外,還要引入另外一個東西

CCTouchDispatcher

這個東西是 touch 的管理器

對應兩個協議 分別有兩個函數

-(void) addStandardDelegate:(id<CCStandardTouchDelegate>) delegate priority:(int)priority;

-(void) addTargetedDelegate:(id<CCTargetedTouchDelegate>) delegate priority:(int)priority swallowsTouches:(BOOL)swallowsTouches;

也就是說某個CCNode 想要使用touch協議 就要在CCTouchDispatcher share類中註冊一下,恩這時候 區別就顯而易見了

Standard 和 targeted 最主要的區別 就是後面那個swallowsTouches

先不管最後的那個參數是什麼 說一下前面兩個。 很簡單第一個是註冊的指針  一般是self 另一個 是優先級 越小越好。。例如CCMenu優先級爲-128

這時就能說傳輸機制了。。。當有touch inside的時候,層與層的傳遞順序是這樣的 優先級爲第一關鍵字 層的高度爲第二關鍵字排序

注意,這裏只能是單獨的一個協議的情況當兩個共存的時候 稍後再說


現在可以說 這兩套協議的區別了。

Standard這套協議,不能過濾掉touch inside 也就說,他會按照優先級給每個層排序。。然後把touch inside 按照順序 分別傳進去,也就是說 從上到下的所有層 只要開啓了self.istouchenabled = YES 那麼他們都會收到 touch inside  而且目前沒發現如何過濾掉,當然了他的優點是 支持多點觸控

targeted這套協議呢

這套協議 從接口上 就可以看出 它只支持單點觸控,而且就測試來看  多點觸控 是當單點觸控來用,但是返回的UITouch 就不知道是哪個了

他的好處是 有了那個swallow 選項,即可判斷是否 下放 touch 參數

而且呢,他的cctouchbegan函數是個bool值,如果你不返回一個yes的話,後面的 move 和 ended 都不會執行,不用每個函數都蛋疼的判斷了,使用的時候 不要用isTouchEnabled這個屬性,因爲這個屬性調用的是addStandardDelegate的那個函數,要麼重載,要麼手動實現,推薦手動實現。


好了 最後說一下 當混合使用這兩套協議 所出現的奇葩問題。。。

demo 1

在hello world上 畫了一個 CCMenuItemFont  (因爲CCMenu 用的是targeted協議 權限爲 -128) 然後給hello worldlayer 開啓istouchenabled 

結果是沒有收到 label 收到 touch 信息 layer 沒收到

demo2 

在原基礎上 重載layer的註冊函數將 layer的權限改爲-200

結果 效果 依舊如demo 1

demo3

關掉istouchenabled 用target協議 權限給-200 其他不變 swallow = yes

結果label 響應不到 touch操作 全被layer 截獲

推論1:單指操作時,權限先傳遞到target  再傳遞給 standard 無論 standard 權限多高 都不能打斷

demo 4

開啓多點觸控支持

將label換成一張大號的圖片

然後在那張圖上做雙指點擊

奇葩的事情發生了。。

根據NSLog返回的情況來看

是layer先 NSlog 然後 image也會NSLog。。。

推論2: 多點觸控時 standard 先會有反應。。。然後target 一樣會收到。。。。

demo5

兩個層 全都開啓 is touch enabled

屏蔽掉CCMenu

然後做雙指點擊

會按照前面說的那個 順序 先優先級 後高度 NSLog出來。。。

寫的有點混亂。。。。

只是筆記罷了。。自己看得懂就好了。。。

http://hi.baidu.com/306996305/blog/item/8be3d4ce1997e422b600c80d.html

發佈了20 篇原創文章 · 獲贊 5 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章