2010-10-24 49 views
1

我正在写一个应用程序的iPhone使用cocos2d在哪里我有4个按钮的精灵。我想通过使用2个不同的.png文件代表按下/未按下的状态来实现按钮功能。我认为这会比使用动画更好。除了检测何时按下和释放按钮,我还需要检测何时发生双按键组合按键(如和弦)。我甚至可能把这个转发到3和4按钮组合。我想要实现的另一个功能是检测是否从按钮内发出轻弹,并用另一个动作序列作出响应。同步雪碧触摸检测 - iPhone和cocos2d

什么是最佳的方法呢?我会使用四个按钮的边界矩形或精灵(它们是否在方形阵列中)并吞下触摸?那么我会使用较小的精灵rects来确定触摸发生在哪一个?或者我会让单个sprite rects进行检测,然后让他们检查其他按钮是否也被按下,然后同时释放?我会使用Bool状态变量用于这两种方式吗?

我已经使用CCMenu和CCMenuitem,通过为每个按钮精灵制作一个Menu/Menu-item,然而,我无法弄清楚如何检测一个菜单中的菜单项是否被按下并释放,同时按下并释放了不同菜单中的菜单项。我使用了单独的菜单,因为如果我使用多个菜单项相同的菜单,则一次只能按一个菜单项。我说它工作得很好,这意味着它可以在单台和多台印刷机上工作,但它会将倍数视为两次连续印刷,而不是同时印刷。 IE浏览器:单次按下导致运行一个单一的动作序列(按照预期),同时按下按键组合导致为每个按钮运行单独的按钮动作序列,就好像我分别按下它们一样(我希望它运行一个特定的动作序列到那个按钮组合)。这就是为什么我决定尝试实现我自己的按钮系统而不是使用CCMenu系统可能更好。我是否正在摆脱CCMenu?

对不起,很长的描述,但它确实说具体。 B)

任何有关其他人如何实现或将实现这一点的深刻见解将不胜感激!

+0

没有人有什么想法吗?如果可以的话请帮忙。 – Mark7777G 2010-10-30 16:44:14

+0

对不起,我在这里有点忙。我也可以推荐你尝试复制并粘贴到gamedev.stackexchange.com这个问题?它会得到更多的游戏意见:)道歉。 – 2010-11-04 09:31:54

+0

也试过了,谢谢。 – Mark7777G 2010-11-08 01:10:32

回答

2

下面是我如何实现这一点,以防其他人试图做到这一点。

spuButton.h(一CCSprite子类)

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 

typedef enum tagButtonState { 
    kButtonStatePressed, 
    kButtonStateNotPressed 
} ButtonState; 

typedef enum tagButtonStatus { 
    kButtonStatusEnabled, 
    kButtonStatusDisabled 
} ButtonStatus; 

@interface spuButton : CCSprite <CCTargetedTouchDelegate> { 
@private 
    ButtonState buttonState; 
    CCTexture2D *buttonNormal; 
    CCTexture2D *buttonLit; 
    ButtonStatus buttonStatus; 
} 

@property(nonatomic, readonly) CGRect rect; 

+ (id)spuButtonWithTexture:(CCTexture2D *)normalTexture; 

- (void)setNormalTexture:(CCTexture2D *)normalTexture; 
- (void)setLitTexture:(CCTexture2D *)litTexture; 
- (BOOL)isPressed; 
- (BOOL)isNotPressed; 
- (void)makeDisabled; 
- (void)makeEnabled; 
- (BOOL)isEnabled; 
- (BOOL)isDisabled; 
- (void)makeLit; 
- (void)makeNormal; 
- (void)dealloc; 

@end 

spuButton.m

#import "spuButton.h" 
#import "cocos2d.h" 

@implementation spuButton 

- (CGRect)rect { 
    CGSize s = [self.texture contentSize]; 
    return CGRectMake(-s.width/2, -s.height/2, s.width, s.height); 
} 

+ (id)spuButtonWithTexture:(CCTexture2D *)normalTexture { 
    return [[[self alloc] initWithTexture:normalTexture] autorelease]; 
} 

- (void)setNormalTexture:(CCTexture2D *)normalTexture { 
    buttonNormal = normalTexture; 
} 
- (void)setLitTexture:(CCTexture2D *)litTexture { 
    buttonLit = litTexture; 
} 

- (BOOL)isPressed { 
    if (buttonState== kButtonStateNotPressed) return NO; 
    if (buttonState== kButtonStatePressed) return YES; 
    return NO; 
} 

- (BOOL)isNotPressed { 
    if (buttonState== kButtonStateNotPressed) return YES; 
    if (buttonState== kButtonStatePressed) return NO; 
    return YES; 
} 

- (void)makeDisabled { 
    buttonStatus = kButtonStatusDisabled; 
    buttonState= kButtonStateNotPressed; 
    [self makeNormal]; 
} 
- (void)makeEnabled { 
    buttonStatus = kButtonStatusEnabled; 
    buttonState= kButtonStateNotPressed; 
    [self makeNormal]; 
} 

- (BOOL)isEnabled { 
    if (buttonStatus== kButtonStatusDisabled) return NO; 
    if (buttonStatus== kButtonStatusEnabled) return YES; 
    return NO; 
} 

- (BOOL)isDisabled { 
    if (buttonStatus== kButtonStatusEnabled) return NO; 
    if (buttonStatus== kButtonStatusDisabled) return YES; 
    return YES; 
} 

- (void)makeLit { 
    [self setTexture:buttonLit]; 
} 

- (void)makeNormal { 
    [self setTexture:buttonNormal]; 
} 

- (id)initWithTexture:(CCTexture2D *)aTexture { 
    if ((self = [super initWithTexture:aTexture])) {  
     buttonState = kButtonStateNotPressed; 
     buttonStatus = kButtonStatusEnabled; 
    } 
    return self; 
} 

- (void)onEnter { 
    if (buttonStatus == kButtonStatusDisabled) return; 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO]; 
    [super onEnter]; 
} 

- (void)onExit { 
    if (buttonStatus == kButtonStatusDisabled) return; 
    [[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; 
    [super onExit]; 
} 

- (BOOL)containsTouchLocation:(UITouch *)touch { 
    return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]); 
} 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    if (buttonStatus == kButtonStatusDisabled) return NO; 
    if (buttonState== kButtonStatePressed) return NO; 
    if (![self containsTouchLocation:touch]) return NO; 

    buttonState= kButtonStatePressed; 
    [self makeLit]; 

    return YES; 
} 

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { 
    // If it weren't for the TouchDispatcher, you would need to keep a reference 
    // to the touch from touchBegan and check that the current touch is the same 
    // as that one. 
    // Actually, it would be even more complicated since in the Cocos dispatcher 
    // you get NSSets instead of 1 UITouch, so you'd need to loop through the set 
    // in each touchXXX method. 

    if (buttonStatus == kButtonStatusDisabled) return; 
    if ([self containsTouchLocation:touch]) return; 

    buttonState= kButtonStateNotPressed; 
    [self makeNormal]; 
} 

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 
    if (buttonStatus == kButtonStatusDisabled) return; 

    buttonState= kButtonStateNotPressed; 
    [self makeNormal]; 
} 

- (void)dealloc { 
    [buttonNormal release]; 
    [buttonLit release]; 
    [super dealloc]; 
} 

@end 

HelloWorldScene.m中(只是我滴答:方法来让我的其他功能,从混淆的例子)

-(void)tick:(ccTime)dt { 
    if ([[_otherControlsArray objectAtIndex:0] wasPressed]) { 
     [[_otherControlsArray objectAtIndex:0] setWasPressed:NO]; 
     [self removeChild:[_otherControlsArray objectAtIndex:0] cleanup:YES]; 
     [self addChild:[_otherControlsArray objectAtIndex:1]]; 
     NSLog(@"Play"); 

     _gameHasNotBeenPlayedYet = NO; 
     Snarfle_s_PowerUPAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
     [delegate makeNotPaused]; 
     [self gameLogic]; 
    } 

    if (_gameHasNotBeenPlayedYet) { 
     return; 
    } 

    if (_buttonsPressedAndReleased > 0) { //respond to button(s) released and reset 
     NSLog(@"Buttons Pressed and Released-->%d",_buttonsPressedAndReleased); 
     if ([self checkButtons:_buttonsPressedAndReleased]); 
     _buttonsPressed = 0; 
     _buttonsPressedAndReleased = 0; 

     return; 
    } 
    if (_buttonsPressed <= 4) { // two buttons have not already been pressed 
     for (spuButton *aButton in _fourButtonsArray) { 
      if ([aButton isNotPressed]) continue; //this button is not pressed 
      if (_buttonsPressed == 0) { //this button is pressed and no other buttons have been pressed 
       _buttonsPressed = aButton.tag; 
       continue; 
      } 
      //this button is pressed while another has been pressed 
      //figure out which two buttons have been pressed 
      if (_buttonsPressed == 1) { //red plus another 
       switch (aButton.tag) { 
        case 2: //blue 
         _buttonsPressed = 5; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 3: //green 
         _buttonsPressed = 6; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 4: //yellow 
         _buttonsPressed = 7; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         break; 
        default: 
         _buttonsPressed = 1; 
         break; 
       } 
      } 
      if (_buttonsPressed == 2) { //blue plus another 
       switch (aButton.tag) { 
        case 1: //red 
         _buttonsPressed = 5; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 3: //green 
         _buttonsPressed = 8; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 4: //yellow 
         _buttonsPressed = 9; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         break; 
        default: 
         _buttonsPressed = 2; 
         break; 
       } 
      } 
      if (_buttonsPressed == 3) { //green plus another 
       switch (aButton.tag) { 
        case 1: //red 
         _buttonsPressed = 6; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 2: //blue 
         _buttonsPressed = 8; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
         break; 
        case 4: //yellow 
         _buttonsPressed = 10; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         break; 
        default: 
         _buttonsPressed = 3; 
         break; 
       } 
      } 
      if (_buttonsPressed == 4) { //yellow plus another 
       switch (aButton.tag) { 
        case 1: //red 
         _buttonsPressed = 7; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         break; 
        case 2: //blue 
         _buttonsPressed = 9; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
         break; 
        case 3: //green 
         _buttonsPressed = 10; 
         [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
         [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
         break; 
        default: 
         _buttonsPressed = 4; 
         break; 
       } 
      } 
      if (_buttonsPressed > 4) break; //more than one has been pressed and identified 
     } 
    } 
    //now we know what buttons have been pressed now check to see if they have been released 
    //if more than one has been pressed disable the other two 
    //also if more than one has been pressed and one of them gets released disable the released one but keep it lit 
    switch (_buttonsPressed) { 
     case 1: //red 
      if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) _buttonsPressedAndReleased = 1; 
      break; 
     case 2: //blue 
      if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) _buttonsPressedAndReleased = 2; 
      break; 
     case 3: //green 
      if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) _buttonsPressedAndReleased = 3; 
      break; 
     case 4: //yellow 
      if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) _buttonsPressedAndReleased = 4; 
      break; 
     case 5: //red & blue 
      if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:1] isNotPressed])) _buttonsPressedAndReleased = 5; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:0] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:1] makeLit]; 
       } 
      } 
      break; 
     case 6: //red & green 
      if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:2] isNotPressed])) _buttonsPressedAndReleased = 6; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:0] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:2] makeLit]; 
       } 
      } 
      break; 
     case 7: //red & yellow 
      if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 7; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:0] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:0] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:3] makeLit]; 
       } 
      } 
      break; 
     case 8: //blue & green 
      if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:2] isNotPressed])) _buttonsPressedAndReleased = 8; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:1] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:2] makeLit]; 
       } 
      } 
      break; 
     case 9: //blue & yellow 
      if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 9; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:1] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:1] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:3] makeLit]; 
       } 
      } 
      break; 
     case 10: //green & yellow 
      if (([[_fourButtonsArray objectAtIndex:2] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 10; 
      else { 
       if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:2] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:2] makeLit]; 
       } 
       if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) { 
        [[_fourButtonsArray objectAtIndex:3] makeDisabled]; 
        [[_fourButtonsArray objectAtIndex:3] makeLit]; 
       } 
      } 
      break; 
     default: 
      _buttonsPressedAndReleased = 0; 
      break; 
    } 
}