Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Here is how I implemented this in case anyone else is trying to do this (I have limited it to 2-button combos but I could easily extend the logic to 3 &amp; 4-button combos as well). I chose to handle each touch individually using the ccTouchBegan/Ended/Moved instead of using the ccTouchesBegan/Ended/Moved because I just couldn't get it to work with the hash code. Any alternative ideas would be welcome.</p> <p>spuButton.h (a CCSprite Subclass)</p> <pre><code>#import &lt;Foundation/Foundation.h&gt; #import "cocos2d.h" typedef enum tagButtonState { kButtonStatePressed, kButtonStateNotPressed } ButtonState; typedef enum tagButtonStatus { kButtonStatusEnabled, kButtonStatusDisabled } ButtonStatus; @interface spuButton : CCSprite &lt;CCTargetedTouchDelegate&gt; { @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 </code></pre> <p>spuButton.m</p> <pre><code>#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 </code></pre> <p>HelloWorldScene.m (Just my tick: method to keep my other functions from confusing the example)</p> <pre><code>-(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 &gt; 0) { //respond to button(s) released and reset NSLog(@"Buttons Pressed and Released--&gt;%d",_buttonsPressedAndReleased); if ([self checkButtons:_buttonsPressedAndReleased]); _buttonsPressed = 0; _buttonsPressedAndReleased = 0; return; } if (_buttonsPressed &lt;= 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 &gt; 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 &amp; blue if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) &amp;&amp; ([[_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 &amp; green if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) &amp;&amp; ([[_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 &amp; yellow if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) &amp;&amp; ([[_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 &amp; green if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) &amp;&amp; ([[_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 &amp; yellow if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) &amp;&amp; ([[_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 &amp; yellow if (([[_fourButtonsArray objectAtIndex:2] isNotPressed]) &amp;&amp; ([[_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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload