Прикосновения спрайтов в Cocos2d - PullRequest
0 голосов
/ 16 ноября 2011

Я пытаюсь создать расширенный класс CCSprite, который может обнаруживать касания.Я провел некоторое исследование и обнаружил пример на http://anny.fm/c/iphone/cocos2d/TouchableSprite/, который был создан Энни в этой ветке форума http://www.cocos2d -iphone.org / forum / topic / 3196 (последнее сообщение).

Используя это, я настроил свой класс следующим образом:

Заголовок

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface PianoKey : CCSprite <CCTargetedTouchDelegate> {

}

-(BOOL) tsTouchBegan:     (UITouch*)touch withEvent: (UIEvent*)event;
-(void) tsTouchMoved:     (UITouch*)touch withEvent: (UIEvent*)event;
-(void) tsTouchEnded:     (UITouch*)touch withEvent: (UIEvent*)event;
-(void) tsTouchCancelled: (UITouch*)touch withEvent: (UIEvent*)event;

@end

и реализация ...

@implementation PianoKey

-(id)initWithKey:(int)key {
if((self = [super initWithFile:[NSString stringWithFormat:@"key_%i.png",key]])) {

}
return self;
}


 -(BOOL) tsTouchBegan:(UITouch*)touch withEvent: (UIEvent*)event { 
NSLog( @"tsTouchBegan"); 
return YES; 
}
 -(void) tsTouchMoved:(UITouch*)touch withEvent: (UIEvent*)event { 
NSLog( @"tsTouchMoved"); 

} 
-(void) tsTouchEnded:(UITouch*)touch withEvent: (UIEvent*)event { 
NSLog( @"tsTouchEnded");

}
-(void) tsTouchCancelled:(UITouch*)touch withEvent: (UIEvent*)event { 
NSLog( @"tsTouchCancelled");
}

//
// Utilities. Don't override these unless you really need to.
//

-(CGRect) rect {
CGSize s = [self.texture contentSize];
return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}

-(BOOL) didTouch: (UITouch*)touch {
return CGRectContainsPoint( [self rect], [self convertTouchToNodeSpaceAR: touch] );
}

//
// The actual touch listener functions. Don't override these either.
//

-(BOOL) ccTouchBegan:(UITouch*)touch withEvent: (UIEvent*)event { 
    NSLog(@"attempting touch.");
    if([self didTouch: touch]) {
        return [self tsTouchBegan:touch withEvent: event]; 
    }
return NO; 
}
-(void) ccTouchMoved:     (UITouch*)touch withEvent: (UIEvent*)event { if([self didTouch: touch])        [self tsTouchMoved:     touch withEvent: event]; }
-(void) ccTouchEnded:     (UITouch*)touch withEvent: (UIEvent*)event { if([self didTouch: touch])        [self tsTouchEnded:     touch withEvent: event]; }
-(void) ccTouchCancelled: (UITouch*)touch withEvent: (UIEvent*)event { if([self didTouch: touch])        [self tsTouchCancelled: touch withEvent: event]; }

@end

Я понимаю методы, описанные вышеНапример, обнаружение, было ли касание в пределах спрайта, однако я застрял в том, почему я не получаю никакого ответа, когда нажимаю клавишу.Я новичок в реализации CCTargetdTouchDelegate, поэтому я предполагаю, что это может быть как-то связано с этим ...

1 Ответ

0 голосов
/ 16 ноября 2011

Вам не нужен целевой сенсорный делегат, он просто разбивает NSSet касаний на отдельные сообщения ccTouchXXX. Вашей реализации просто не хватает регистрации и отмены регистрации CCTargetedTouchHandler. Обычно это делается в onEnter, чтобы он работал с любым типом узла, а не только с CCLayer:

-(void) onEnter
{
    [super onEnter];
    [[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MIN+1 swallowsTouches:YES];
}

-(void) dealloc
{
    [[TouchDispatcher sharedDispatcher] removeDelegate:self];
    [super dealloc];
}

Кстати, Kobold2D уже имеет расширенный класс CCNode, который может проверять, было ли касание на узле (спрайты, метки и т. Д.) С помощью этого теста:

[node containsTouch:uiTouch];

Просто сказать, что вам не пришлось бы делать всю эту работу. ;)

...