Hi Riq,
My node is a subclass of Layer but it still doesn't detect any touches, please see my code below, thanks.
Dan
--
// Code below excludes imports etc for brevity
// In MySprite.h
typedef enum tagSpriteState {
kSpriteStateGrabbed,
kSpriteStateUngrabbed
} SpriteState;
@interface MySprite : AtlasSprite <TargetedTouchDelegate> {
@private
SpriteState state;
}
@property(nonatomic, readonly) CGRect rect;
+ (id)loadSpriteImage:(NSString *)spriteImage;
@end
// In MySprite.m
@implementation Menu1Option
- (id) init {
if ((self = [super init]) == nil) return nil;
state = kSpriteStateUngrabbed;
return self;
}
- (CGRect)rect
{
float w = [self contentSize].width;
float h = [self contentSize].height;
CGPoint point = CGPointMake([self position].x - (w / 2), [self position].y - (h / 2));
return CGRectMake(point.x, point.y, w, h);
}
+ (id)loadMenuOptionImage:(NSString *) menuOptionImage
{
return [Sprite spriteWithFile:menuOptionImage];
}
- (void)onEnter
{
[[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
[super onEnter];
}
- (void)onExit
{
[[TouchDispatcher sharedDispatcher] removeDelegate:self];
[super onExit];
}
- (BOOL)containsTouchLocation:(UITouch *)touch
{
return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
}
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
if (state != kSpriteStateUngrabbed) return NO;
if ( ![self containsTouchLocation:touch] ) return NO;
state = kSpriteStateGrabbed;
return YES;
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
NSAssert(state == kSpriteStateGrabbed, @"Sprite - Unexpected state!");
CGPoint touchPoint = [touch locationInView:[touch view]];
touchPoint = [[Director sharedDirector] convertCoordinate:touchPoint];
self.position = CGPointMake(touchPoint.x, self.position.y);
}
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
NSAssert(state == kSpriteStateGrabbed, @"Sprite - Unexpected state!");
state = kSpriteStateUngrabbed;
}
@end
// In MenuScene.h
AtlasSprite *bg;
MySprite *mySprite1;
@interface MenuScene : Scene {}
@end
@interface MenuLayer: Layer {}
@end
// In MenuScene.m
@implementation MenuScene
- (id)init
{
if ((self = [super init]) == nil) return nil;
MenuLayer *menuLayer = [MenuLayer node];
[self addChild:menuLayer];
return self;
}
- (void)onExit
{
[super onExit];
}
@end
@implementation MenuLayer
- (id) init {
if ((self = [super init]) == nil) return nil;;
windowSize = [[Director sharedDirector] winSize];
bg = [Sprite spriteWithFile:@"mainmenu1.png"];
[bg setPosition:ccp(160, 240)];
[self addChild:bg z:0];
mySprite1 = [Menu1Option loadMenuOptionImage:@"mySprite1.png"];
mySprite1.opacity = 0;
[mySprite1 setPosition: ccp(windowSize.width / 2, 280)];
id action1 = [FadeIn actionWithDuration:0.8f];
[mySprite1 runAction: action1];
return self;
}
@end