<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [?李華明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夢的小褲衩,娃哈哈~)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看