歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

cocos2d中實現觸摸按鈕換圖效果方案

主要原理是當TouchBegan時根據按鈕下的坐標把對應按鈕換成按下的效果圖,當TouchMoved時根據移動previousLocationInView坐標取消對應按鈕的按下效果圖,即把按鈕還原成未按下的圖,當TouchEnded時根據抬手的坐標取消對應按鈕的按下效果圖,也即把按鈕還原成未按下的圖,直接上代碼:

  1. -(id) init  
  2. {  
  3.     // always call "super" init   
  4.     // Apple recommends to re-assign "self" with the "super" return value   
  5.     if( (self=[super init])) {  
  6.           
  7.         [self show];  
  8.           
  9.         self.isTouchEnabled=YES;  
  10.     }  
  11.     return self;  
  12. }  
  13.   
  14. -(void) show  
  15. {  
  16.     CGSize s = [[CCDirector sharedDirector] winSize];  
  17.       
  18.     //觸摸數組,用於存放要檢測觸摸的精靈   
  19.     movableSprites = [[NSMutableArray alloc] init];  
  20.       
  21.     [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineButton.plist"];  
  22.     //根據一個plist文件名構建CCSpriteFrame對象並添加到內存池中,就是加載要用到的各種圖片   
  23.   
  24.     //背景圖   
  25.     CCSprite *bg = [CCSprite spriteWithFile:@"bg.png"];  
  26.     bg.position=ccp(s.width/2,s.height/2);  
  27.     [self addChild:bg z:-1 tag:99];  
  28.       
  29.     //levelBt等級按鈕   
  30.     levelBt=[CCSprite spriteWithSpriteFrameName:@"btnLevel.png"];  
  31.     levelBt.position=ccp(170,levelBt.contentSize.height/2+50);  
  32.     [self addChild:levelBt z:1 tag:103];  
  33.     [movableSprites addObject:levelBt];  
  34.       
  35.     //scoreBt按鈕   
  36.     scoreBt=[CCSprite spriteWithSpriteFrameName:@"btnScore.png"];  
  37.     scoreBt.position=ccp(230,scoreBt.contentSize.height/2+50);  
  38.     [self addChild:scoreBt z:1 tag:104];  
  39.     [movableSprites addObject:scoreBt];  
  40.       
  41.     //moreBt按鈕   
  42.     moreBt=[CCSprite spriteWithSpriteFrameName:@"btnMore.png"];  
  43.     moreBt.position=ccp(290,moreBt.contentSize.height/2+50);  
  44.     [self addChild:moreBt z:1 tag:105];  
  45.     [movableSprites addObject:moreBt];  
  46.       
  47. }  
  48.   
  49. ////////////////////////////////////////////////////////   
  50.   
  51. #pragma mark Touch Method   
  52. //更換觸摸協議   
  53. -(void) registerWithTouchDispatcher  
  54. {  
  55.     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:YES];  
  56.     //priority參數越小優先級越高   
  57. }  
  58.   
  59. -(BOOL) ccTouchBegan:(UITouch*)touch withEvent:(UIEvent *)event  
  60. {  
  61.     BOOL hasTouched = NO;  
  62.     CGPoint touchlocation = [touch locationInView: [touch view]];  
  63.     touchlocation =[[CCDirector sharedDirector] convertToGL:touchlocation];  
  64.       
  65.     CCSprite * newSprite = nil;  
  66.     if (newSprite == nil) {  
  67.         for (CCSprite *sprite in movableSprites) {  
  68.             if (CGRectContainsPoint(sprite.boundingBox, touchlocation)) {              
  69.                 newSprite = sprite;  
  70.                 break;  
  71.             }  
  72.         }   
  73.           
  74.     }  
  75.     int na = [newSprite tag];  
  76.     switch (na) {  
  77.         case 103:  
  78.             CCLOG(@"levelBt");  
  79.             //換按下的效果圖   
  80.             [GameHelper changeImageBtn:newSprite imagePath:@"btnLeveled.png"];  
  81.             hasTouched = YES;  
  82.             break;  
  83.         case 104:  
  84.             CCLOG(@"scoreBt");  
  85.             //換按下的效果圖   
  86.             [GameHelper changeImageBtn:newSprite imagePath:@"btnScoreed.png"];  
  87.             hasTouched = YES;  
  88.             break;  
  89.         case 105:  
  90.             CCLOG(@"moreBt");  
  91.             //換按下的效果圖   
  92.             [GameHelper changeImageBtn:newSprite imagePath:@"btnMoreed.png"];  
  93.             hasTouched = YES;  
  94.             break;  
  95.         default:  
  96.             hasTouched = NO;  
  97.             break;  
  98.     }  
  99.     if (hasTouched==YES) {  
  100.         CCLOG(@"吞並觸摸事件");  
  101.         //按中本層的按鈕   
  102.         return YES;  
  103.     }  
  104.     else  
  105.     {  
  106.         CCLOG(@"傳遞觸摸事件");  
  107.         //未按中本層的按鈕   
  108.         return NO;  
  109.     }  
  110.       
  111. }  
  112.   
  113. -(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event{  
  114.   
  115.     //獲取舊的坐標,即按下時的坐標,移動了就表示取消對應按鈕的動作,那麼就要還原按鈕原圖   
  116.     CGPoint oldTouchLocation=[touch previousLocationInView:touch.view];  
  117.     oldTouchLocation=[[CCDirector sharedDirector] convertToGL:oldTouchLocation];  
  118.       
  119.     CCSprite * newSprite = nil;  
  120.     if (newSprite == nil) {  
  121.         for (CCSprite *sprite in movableSprites) {  
  122.             if (CGRectContainsPoint(sprite.boundingBox, oldTouchLocation)) {              
  123.                 newSprite = sprite;  
  124.                 break;  
  125.             }  
  126.         }   
  127.           
  128.     }  
  129.     int na = [newSprite tag];  
  130.     switch (na) {  
  131.         case 103:  
  132.             CCLOG(@"levelBt");  
  133.             //換未按下的效果圖   
  134.             [GameHelper changeImageBtn:newSprite imagePath:@"btnLevel.png"];  
  135.             break;  
  136.         case 104:  
  137.             CCLOG(@"scoreBt");  
  138.             //換未按下的效果圖   
  139.             [GameHelper changeImageBtn:newSprite imagePath:@"btnScore.png"];  
  140.             break;  
  141.         case 105:  
  142.             CCLOG(@"moreBt");  
  143.             //換未按下的效果圖   
  144.             [GameHelper changeImageBtn:newSprite imagePath:@"btnMore.png"];  
  145.             break;  
  146.         default:  
  147.             break;  
  148.     }  
  149.       
  150. }  
  151.   
  152. -(void) ccTouchEnded:(UITouch*)touch withEvent:(UIEvent *)event  
  153. {  
  154.     CGPoint touchlocation = [touch locationInView: [touch view]];  
  155.     touchlocation =[[CCDirector sharedDirector] convertToGL:touchlocation];  
  156.       
  157.     CCSprite * newSprite = nil;  
  158.     if (newSprite == nil) {  
  159.         for (CCSprite *sprite in movableSprites) {  
  160.             if (CGRectContainsPoint(sprite.boundingBox, touchlocation)) {              
  161.                 newSprite = sprite;  
  162.                 break;  
  163.             }  
  164.         }   
  165.           
  166.     }  
  167.     int na = [newSprite tag];  
  168.     switch (na) {  
  169.         case 103:  
  170.             CCLOG(@"levelBt");  
  171.             //換按下的效果圖   
  172.             [GameHelper changeImageBtn:newSprite imagePath:@"btnLevel.png"];  
  173.             //執行按鈕觸發的函數   
  174.             [self showSelectLevelLayer];  
  175.             break;  
  176.         case 104:  
  177.             CCLOG(@"scoreBt");  
  178.             //換按下的效果圖   
  179.             [GameHelper changeImageBtn:newSprite imagePath:@"btnScore.png"];  
  180.             //執行按鈕觸發的函數   
  181.             [self showScoreLayer];  
  182.             break;  
  183.         case 105:  
  184.             CCLOG(@"moreBt");  
  185.             //換按下的效果圖   
  186.             [GameHelper changeImageBtn:newSprite imagePath:@"btnMore.png"];  
  187.             //執行按鈕觸發的函數   
  188.             [self showMoreLayer];  
  189.             break;  
  190.         default:  
  191.             break;  
  192.     }  
  193.       
  194. }  
  195.   
  196. ///////////////////////////////////////////////////////////   
  197. -(void)showSelectLevelLayer  
  198. {  
  199.   
  200. }  
  201.   
  202. -(void)showScoreLayer  
  203. {  
  204.   
  205. }  
  206.   
  207. -(void)showMoreLayer  
  208. {  
  209.       
  210. }  
  211.   
  212. ///////////////////////////////////////////////////////////  
以上純屬個人想法,若有更好的方案敬請賜教!
Copyright © Linux教程網 All Rights Reserved