views:

971

answers:

1

I'm really sorry, I realize there have been several questions asked about cocos2d touch detection (including this answer which helped me a bunch), but I just can't get any of them to work. I would have commented on the answer I linked instead of asking my own question, but i don't have enough rep to leave comments.

All I want to do is stop animation as soon as a user taps anywhere on the screen.

Here's my code so far:

- (BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touches Began");
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView: [touch view]];
    location = [[Director sharedDirector] convertCoordinate: location];

    CGRect mySurface = (CGRectMake(100, 100, 320, 480));
    if(CGRectContainsPoint(mySurface, location)) {
     NSLog(@"Event Handled");
     return kEventHandled;
     [[Director sharedDirector] stopAnimation];
       }
     return kEventIgnored;
     NSLog(@"Event Ignored");

}

I've tried both BOOL and void, ccTouchesBegan and touchesBegan, in a layer file and a cocosNode file, and many other things. Nothing happens. Nothing shows in the log, and the animation continues on its merry little way. What am I doing wrong?

+2  A: 

The main problem is that you've got the [[Director sharedDirector] stopAnimation]; after the return kEventHandled; rather than before it. return exits the function as soon as it's called, so anything after it will never get reached.

I don't have my mac in front of me to check the rest of your code, but it seems fine, so I'm guessing that's the main problem. If you're not even seeing the NSLog(@"Touches Began"); then you need to make sure that you're doing this in a CocosNode that extends Layer.

Another useful thing(once you're seeing the touches) is the NSStringFromCGPoint function, which allows you to easily display and debug the values in a CGPoint, so you could do something like:

NSLog(@"This layer was touched at %@", NSStringFromCGPoint(location));
Matt Rix
I'm foggy on what extending means. Am I supposed to do @interface GameLayer : Layer <CocosNode> or @interface Node : CocosNode <Layer>?
Evelyn
I think your code is correct, it's just that you have to move the stopAnimation line above the return line, and same with the last NSLog. Otherwise, that code will never be reached. So fix that first.
Jorge Israel Peña
I did that, and it still didn't do anything...
Evelyn
It should be `@interface GameLayer : Layer` because Layer already extends CocosNode. Also, in the init method you'll need to set `self.isTouchEnabled = YES;`Take a look at this post for more info: http://stackoverflow.com/questions/377785/problem-with-cocos2d-for-iphone-and-touch-detection
Matt Rix