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出來。。。
寫的有點混亂。。。。
隻是筆記罷了。。自己看得懂就好了。。。
https://hi.baidu.com/306996305/blog/item/8be3d4ce1997e422b600c80d.html
最後更新:2017-04-02 18:30:38