Search code examples
ioscocos2d-iphonespritetouches

How to disable touch on a CGRect / Sprite after one touch


How can I disable touches for a CCRect / sprite after it has been touched?

I have in my init method to set the sprite:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"testAtlas_default.plist"];
            sceneSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"testAtlas_default.png"];

[self addChild:sceneSpriteBatchNode z:0];

dinosaur1_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur1-c.png"];
[sceneSpriteBatchNode addChild:dinosaur1_c];

[dinosaur1_c setPosition:CGPointMake(245.0, winSize.height - 174.0)];

I then create a CGRect using the position and size of the sprite as its parameters in:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchLocation = [touch locationInView:[touch view]];
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];

    dinosaur1 = CGRectMake(dinosaur1_c.position.x - (dinosaur1_c.contentSize.width / 2), dinosaur1_c.position.y - (dinosaur1_c.contentSize.height / 2), dinosaur1_c.contentSize.width, dinosaur1_c.contentSize.height);

    if( CGRectContainsPoint(dinosaur1, touchLocation) )
    {
        CCLOG(@"Tapped Dinosaur1_c!");
        PLAYSOUNDEFFECT(PUZZLE_SKULL);

        //  Code to disable touches??
        //  Tried to resize CGRect in here to (0, 0, 1, 1) to get it away from the original sprite, but did not work.  Still was able to tap on CGRect.
        //  Tried [[CCTouchDispatcher sharedDispatcher] setDispatchEvents:NO];, but disables ALL the sprites instead of just this one.

    }
}

I'm able to successfully tap on the sprite to make it play the sound, however I just can't figure out how to disable the CGRect after it is touched. I have tried different methods as commented in the code above. Any ideas or tips are appreciated!


Solution

  • Ok so I solved the problem. In case anyone was wondering, I set up a -(BOOL)isTapped in my header file and set it to NO in my init method.

    When I check for collisions with the touchpoint and the CGRect, I also check to see if isTapped != YES (meaning it hasnt been tapped yet). In that if statement, I do all the actions as normally would but then set isTapped = YES. Now it will skip over when I tap again. Below is my code with the added bits in between *'s

    .h file:
    
    BOOL isTapped;
    

    and in the .m file:

    .m:

    -(id)init
    {
      isTapped = NO;
      // Rest of init method.
    }
    
    -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
    {
        CGPoint touchLocation = [touch locationInView:[touch view]];
        touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
        touchLocation = [self convertToNodeSpace:touchLocation];
    
        dinosaur1 = CGRectMake(dinosaur1_c.position.x - (dinosaur1_c.contentSize.width / 2), dinosaur1_c.position.y - (dinosaur1_c.contentSize.height / 2), dinosaur1_c.contentSize.width, dinosaur1_c.contentSize.height);
    
        if( CGRectContainsPoint(dinosaur1, touchLocation) **&& isTapped != YES**)
        {
            CCLOG(@"Tapped Dinosaur1_c!");
            PLAYSOUNDEFFECT(PUZZLE_SKULL);
    
            **isTapped = YES;**
        }
        else
        {
            CCLog(@"Already Tapped!");
        }
    }
    

    Thanks for looking!