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. ///////////////////////////////////////////////////////////  
以上纯属个人想法,若有更好的方案敬请赐教!

相关内容