【iOS-Cocos 2 dゲーム開発の5】【1】マルチコンタクトとタッチスクリーンイベントの詳細(単一リスニング、イベント配信)


当駅の文章はすべて 李華明Himi オリジナル、転載は必ず明らかなところに明記してください.
黒米GameDev街より転載 テキストリンク: http://www.himigame.com/iphone-cocos2d/450.html 
ここ数日ずっとcocos 2 dをかじって、多くのものを消化して、基本的に手書き会社のゲームを把握することができます;では、今日はいくつかのポイントを出して経験を分かち合い、新しい子供靴たちに参考にします.
この記事では、cococos 2 dがユーザーのタッチスクリーンのリスニングイベントを詳しく紹介します(cocos 2 dには詳細な文章やチュートリアルがたくさんありますが、私はここでは自分の理解から言っただけです)
本題に入ります:全体cocos 2 dからタッチスクリーンに対するイベントの傍受は2種類に分けることができます:
1.単一傍受、いわゆる単一傍受は実はcococos 2 dエンジンフレームワークと関係があります.cococos 2 dでは各ゲームインタフェースで1つのCCLayoutを使用して完成することができるので、1つのCCLayoutが画面に表示された後、ユーザーのボタンイベントを傍受したい場合は、一般的に以下の形式で傍受することができます:(注意:ここではCCLayout類が傍受する方式です)
まず、リスニングを開始します.
 

  
  
  
  
  1. self.isTouchEnabled=YES;  

次に、リスニング関数を書き換えます.
 

  
  
  
  
  1. //    
  2. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event   
  3. {   
  4. }   
  5. //  -     
  6. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event   
  7. {   
  8.        
  9. }   
  10. //  -     
  11. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event   
  12. {   
  13.            
  14. }   

このような傍受はひどいeazyですが、ここではCCLayoutクラスに対する傍受方式であることに注意してください.
 
2.配布を傍受する;さっき言ったように、ゲームの各インタフェースはCCLayoutかもしれませんが、CCSpriteの精霊の主役を単独で傍受したい場合、あるいはCCLayoutに精霊がたくさんいる場合、その中の1つを単独で傍受したい場合は、傍受配布の形式を使用する必要があります.
クラスXX継承CCSpriteをカスタマイズし、YYクラスもCCSpriteを継承し、XXタイプとYYクラスのインスタンスが1つのLayout上に存在すると仮定すると、私はXXとYYタイプをそれぞれ単独で傍受したいと思います.まず、現在継承されているCCSpriteクラスのXXをYYクラスでプロトコルを使用します.
(CCSpriteにself.isTouchEnabled=YESはありません.この関数、直接書かないでくださいね~)
コードは次のとおりです.
 
 

  
  
  
  
  1. @interface XX : CCSprite <CCTargetedTouchDelegate>{   
  2.    
  3. }   

次に、現在のインプリメンテーションクラスで関数を書き換えます.
 

  
  
  
  
  1. -(void) registerWithTouchDispatcher   
  2. {   
  3.     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];   
  4. }   

(この関数は登録リスニングです.何も書かない場合は、現在タッチスクリーンイベントに対応しません.)
 
タッチした各イベント関数を書き換えると、次のようになります.
 

  
  
  
  
  1. //    
  2. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event   
  3. {    
  4.     return NO;   
  5. }   
  6. //    
  7. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event   
  8. {      
  9. }   
  10. //    
  11. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event   
  12. {   
  13.        
  14. }  

 
 

  
  
  
  
  1. // [CCDirector replaceScene:XX], , 3    
  2. // :   
  3. //1.othterScene +(id)Scene——>   
  4. //2.otherScene init——>   
  5. //3.otherScene onEnter——>   
  6. //4.    
  7. //5. Scene onExit ——>   
  8. //6.otherLayout onEnterTransitionDidFinish()   
  9. //7. Scene dealoc    
  10. -(void) onEnter{   
  11.     // Scene init    
  12.     // CCTransitionScene,    
  13.     //( super onEnter )   
  14.     [super onEnter];   
  15. }   
  16. -(void) onEnterTransitionDidFinish{   
  17.     // onEnter    
  18.     // CCTransitionScene,    
  19.     [super onEnterTransitionDidFinish];   
  20. }   
  21. -(void)onExit{    
  22.     // dealloc ;   
  23.     // CCTransitionScene,    
  24.     //( super onExit, )   
  25.     [super onExit];   
  26. }   

このリスニング方式は、様々なリスニング関数が第1のものと類似しているほか、ccTouchBeganの関数には戻りタイプであるブール値があることがわかります.では、その役割について詳しく説明します.XXクラスとYYクラスの両方が第2のリスニング方式を実現した場合、ユーザがスクリーンにタッチした後、(現在ユーザがトリガしているのはXXクラスとYYクラスのインスタンスが存在するCCLayoutである)まずXXまたはYYのccTouchBegan関数に入り、ここではまずXXクラスに入ったと仮定すると、XXクラスのccTouchBeganは応答され、return true;ユーザタッチスクリーンのメッセージをYYクラスに転送して応答しないことを示し、すなわちYYクラスのccTouchBegan関数に応答しない場合、return false;現在のタッチスクリーン情報は、登録されている他のタイプに渡されます.
一言で言えば、returnの値は、本物であれば、ユーザーがイベントをタッチして処理されたことを示し、他のリスニングは行われません.偽物であれば、他の登録されたタイプに処理を渡し続けます.
 
では、第2の傍受方式が一般的に使われており、処理が容易であるため、登録については、一般的には onEnter関数;onEnter関数は、各CCScene間の切り替えに応答する関数であり、CCSceneのライフサイクル関数に相当し、具体的な呼び出し順序は以下の通りである.