2010-10-24 2 views
1

Я пишу приложение для iPhone, используя cocos2d, где у меня есть 4 спрайта, которые являются кнопками. Я решил, что буду реализовывать функциональность кнопки, используя 2 спрайта с разными файлами .png, представляющими нажатые/не нажатые состояния. Я думал, что это будет лучше, чем использование анимации. В дополнение к обнаружению, когда кнопки нажаты и отпущены, мне нужно определить, когда происходит нажатие/отключение комбинации двух кнопок (например, аккорд). Я мог бы даже перенести это вперед на 3 и 4 кнопочные комбо. И еще одна функция, которую я хотел бы реализовать, будет обнаруживать, если щелчок происходит из одной кнопки и отвечает другой последовательностью действий.Одновременное обнаружение Touch Sprite - iPhone & cocos2d

Что было бы оптимальным для этого? Использую ли я ограничивающий прямоугольник/или спрайт для четырех кнопок (они находятся в квадратной форме) и проглатывает штрихи? Тогда я бы использовал меньшие исправления спрайтов, чтобы определить, какие из них касаются (-ы)? Или у меня будут отдельные исправления спрайтов, и затем попросите их проверить, будут ли другие кнопки также нажаты, а затем выпущены в одно и то же время? Могу ли я использовать переменную состояния Bool для любого из этих способов?

У меня было все отлично работает с CCMenu и CCMenuitem, создав одно меню/пункт меню для каждого спрайта; однако я не мог понять, как определить, был ли нажат и высвобожден элемент меню из одного меню одновременно с нажатием и отпуском пункта меню из другого меню. Я использовал отдельные меню, потому что, если бы я использовал одно и то же меню с несколькими пунктами меню, то за один раз можно было бы нажать только одно. Я говорю, что он отлично работает, работая с одиночными и несколькими прессами, но он будет рассматривать мультипликаторы как два последовательных нажатия, а не одновременно. IE: одно нажатие приводило к запуску единственной последовательности действий (как и предполагалось), а одновременная комбинация нажатий приводила к запуску отдельных последовательностей действий кнопок для каждой кнопки, как если бы я нажимал их каждый отдельно (я хочу, чтобы она запускала одну последовательность действий к этой комбинации кнопок). Вот почему я решил, что лучше использовать собственную систему кнопок вместо использования системы CCMenu. Правильно ли я ушел от CCMenu?

Извините за подробное описание, но это было сказано конкретно. B)

Любое понимание того, как кто-либо другой реализовал или будет реализовывать это, будет очень признателен!

+0

У нас нет идей? Пожалуйста, помоги, если можешь. – Mark7777G

+0

Извините, я немного занят здесь. Я также могу порекомендовать вам попробовать скопировать и вставить этот вопрос в gamedev.stackexchange.com? он получит больше игровых мнений :) извинения. –

+0

Пробовал отправлять там тоже, спасибо. – Mark7777G

ответ

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; 
    } 
}