[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/450.html](http://www.himigame.com/iphone-cocos2d/450.html "【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)")> [](http://blog.csdn.net/xiaominghimi/article/details/6665887)
-----------------------------------本章補充開始!----------------------------------
本篇對于多觸點和觸屏事件已經做了一個詳細的說明,但是有一點忽略了,就是開啟多觸點的支持!步驟如下:**
首先進入AppDelegate.m 類中,
~~~
- (void) applicationDidFinishLaunching:(UIApplication*)application{}
~~~
在上面這個方法中添加如下一句開啟多觸點支持的代碼:
~~~
//支持多觸點
[viewController.view setMultipleTouchEnabled:YES];
~~~
其他類設置多觸點:
[[[CCDirectorsharedDirector]openGLView]setMultipleTouchEnabled:YES];
--------------------------本章補充完畢-----------------------------------------------------------------------------
最近幾天一直在啃cocos2d,消化了不少東西,基本可以有些把握下手寫公司的游戲了;那么今天就把一些重點的拿出來分享下經驗,給新童鞋們作為參考;
這篇就來詳細介紹下cocos2d對用戶觸屏的監聽事件進行下分析(cocos2d有很多詳細的文章和教程,我這里只是出于自己的理解來說)
進入正題:從整體cocos2d對觸屏的事件監聽可以分為兩種:
1.單一監聽,所謂單一監聽其實是跟cocos2d引擎框架有關,因為在cocos2d中每個游戲界面都可以使用一個CCLayout完成,那么當一個CCLayout在屏幕顯示出來后,想要監聽用戶的按鍵事件,一般都會使用以下形式來進行監聽:(注意:這里是CCLayout類進行監聽的方式)
首先開啟監聽:
~~~
self.isTouchEnabled=YES;
~~~
然后重寫監聽函數即可:
~~~
//監聽首次觸發事件
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
}
//觸摸事件 - 當手指在屏幕上進行移動
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
}
//觸摸事件 - 當手指從屏幕抬起時調用的方法
-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
}
~~~
此種監聽狠eazy,但是要注意這里是對CCLayout類進行的監聽方式;
2.監聽分發; 剛才說了,游戲的每個界面可能都是一個CCLayout,但是如果我想讓一個CCSprite精靈主角單獨進行監聽,或者說在CCLayout有很多個精靈我想單獨監聽其中的一種的時候,這時候就需要使用監聽分發的形式了;
假設我們自定義了一個類XX繼承CCSprite,還有一個YY類也繼承CCSprite,而且XX類型與YY類的實例都存在于一個Layout上,那么我想對XX與YY類型分別單獨監聽的話;首先我們先讓當前繼承的CCSprite類的XX于YY類都使用 <CCTargetedTouchDelegate>協議;
(CCSprite中沒有 self.isTouchEnabled=YES; 這個函數,別直接寫這個哦~)
代碼如下:
~~~
@interface XX : CCSprite <CCTargetedTouchDelegate>{
}
~~~
然后在當前實現類中重寫一個函數如下:
~~~
-(void) registerWithTouchDispatcher
{
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
~~~
或者將注冊的這句代碼,放在重寫的onEnter函數中也可;
(此函數是注冊監聽,如果里面什么都不寫,則當前不會相應任何觸屏事件;)
重寫觸摸的各事件函數,如下:
~~~
//監聽首次觸發事件
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
return NO;
}
//監聽移動事件
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
}
//監聽離開事件
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
}
~~~
大家可以看到,此種監聽方式除了各種監聽函數與第一種類似之外,在 ccTouchBegan的函數有個返回類型-布爾值;那么其作用下面詳細介紹;如果XX與YY類都實現了第二種監聽方式的話,那么當用戶觸屏后,(當前用戶觸發的是XX與YY類實例所在的CCLayout)首先會進入XX或者YY的其中的ccTouchBegan函數中,這里假設首先進入了XX類中,那么XX類中的ccTouchBegan將會被響應,如果return true;表示不再將用戶觸屏的消息傳遞給YY類中進行響應,也就是說不再響應YY類中的ccTouchBegan函數,那么如果 return false;則會將當前觸屏信息傳遞給其他注冊過的類型中;
一句話概括:return 的值,如果是真則表明用戶觸摸事件已經被處理,其他不會再去進行監聽;如果為假,則會繼續交給其他注冊過的類型中進行處理;
那么第二種監聽的方式比較常用,這樣便于處理,那么至于注冊,一般都是放在?onEnter函數中;onEnter函數是每個CCScene之間切換會被響應的函數,相當于是CCScene的生命周期函數,具體調用順序如下:
~~~
//使用[CCDirector replaceScene:XX],替換場景時,會調用以下3個方法
//調用順序依次為:
//1.othterScene的+(id)Scene——>
//2.otherScene的init——>
//3.otherScene的onEnter——>
//4.運行過渡效果
//5.當前Scene的onExit函數——>
//6.otherLayout的onEnterTransitionDidFinish()
//7.當前Scene的dealoc函數
-(void) onEnter{
//調用其他Scene的init方法以后會調用此方法
//如果使用了CCTransitionScene,本方法將在過渡效果開始后調用
//(如果不調用super onEnter新場景可能對觸摸和加速計無發應)
[super onEnter];
}
-(void) onEnterTransitionDidFinish{
//調用onEnter后會調用此函數
//如果使用了CCTransitionScene,將會在過渡效果完成時調用此方法
[super onEnterTransitionDidFinish];
}
-(void)onExit{
//在調用dealloc之前會調用此函數;
//如果使用了CCTransitionScene,將會在過渡效果結束以后調用此方法
//(如果不調用super onExit,當前場景可能不會從內存中釋放)
[super onExit];
}
~~~
那么大概介紹了監聽事件后,那么觸屏中最關心的就應該是多觸點啦;
~~~
//-----獲取多點觸摸
NSSet *allTouches = [event allTouches];
UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];
UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];
//...類推
~~~
獲取多點狠簡單,那么下面再將基本常用到的幾個判斷寫下:
1-判斷用戶單擊還是雙擊(針對一個觸點)
~~~
if([allTouches count]==1) {
UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];
switch ([touchOne tapCount]) {
case 1:
//單擊
CCLOG(@"%@",@"單擊");
break;
case 2:
//雙擊
CCLOG(@"%@",@"雙擊");
break;
}
}
~~~
1-判斷用戶兩個觸點之間是合攏還是分開(針對兩個觸點)
~~~
if([allTouches count]==2) {
//適當修改處理,不能同時取,否則肯定一樣的啦(可以一個在began 一個在end)
UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];
UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];
CGFloat *disFirst =[self distance:[touchOne locationInView:[self view]]
todistance:[touchTwo locationInView:[self view]]];
UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];
UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];
CGFloat *disFinal =[self distance:[touchOne locationInView:[self view]]
todistance:[touchTwo locationInView:[self view]]];
if (disFirst>disFinal) {
CCLOG(@"%@",@"合攏");
}else{
CCLOG(@"%@",@"分開");
}
}
~~~
這里我就粗略的寫在一起,判定兩個觸點是否合攏其實就是用戶剛觸屏時記錄兩點之間的距離記做disFirst,然后在兩個觸點離開屏幕(或者移動事件中)的時候計算
當前的兩個觸點的距離disFinal,那么最后根據disFirst與disFinal距離關系就能知道是合攏還是分開;
(CCLOG 是cocos2d封裝的打印方法,此種打印在編譯發布正式游戲程序的時候是不會編譯到程序中的,但是NSLOG會一直存在!要注意!)
最后給出兩個函數,用于計算不同方式監聽的函數中獲取(轉換)坐標的,因為cocos2d是openGL進行搭建的框架,所以需要坐標轉換;
~~~
+(CGPoint) locationFromTouches:(NSSet*)touches
{
return [self locationFromTouch:[touches anyObject]];
}
+(CGPoint) locationFromTouch:(UITouch*)touch
{
CGPoint touchLocation = [touch locationInView: [touch view]];
return [[CCDirector sharedDirector] convertToGL:touchLocation];
}
~~~
兩個方法一看就能看出區別,一個是UITouch的,一個是NSSet,一個是單一監聽,一個是分發監聽;>
ok,本章就到這里~~~(下周進入封閉開發了,吃睡都在公司了,咳咳,帶上我的多啦a夢的小褲衩,娃哈哈~)
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取&quot;產品付費數量等于0的問題&quot;】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&amp;CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&amp;自定義類細節說明&amp;Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&amp;Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&amp;&amp;Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&amp;設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)