2012-07-06 1 views
0

J'ai sous-classé CCSprite pour détecter un contact à lui-même. Le contactBegan se déclenche au toucher, mais le journal indique que le même sprite manipule tout le temps, même si je touche à chaque fois des sprites différents.
(Son adresse de pointeur est la même pour tous les contacts.)détection tactile pour un sprite dans cocos2d

D'autres journaux montrent que c'est le dernier sprite que j'ai ajouté au calque du monde.

Pourquoi le dernier sprite que j'ai ajouté réagit-il aux événements tactiles tout seul?

J'ai utilisé CCSpriteBatchNode, cela est-il lié au problème?

Ou est-ce parce que cocos2d n'effectue pas de hit-test pour trouver l'objet correct pour envoyer l'événement tactile?

+0

montrer votre code, si quelqu'un peut vous aider à – Ayaz

Répondre

1

Vous devez vérifier si l'emplacement du contact est à l'intérieur des limites de l'image-objet.

Certains pseudo-code bizarre

function touchBegan(UITouch touch, etc) 
    CGPoint pos = get location of touch; 
    if (CGRectContainsPoint(sprite.boundingBox, pos)) //I think that is the method you need. It's something like that. 
     NSLog(@"Sprite was touched!"); 
     return YES; 
+0

Cela a été marquée comme la bonne réponse, mais le code est clair. Les informations d'image UITouch et les informations sprite boundingBox sont incompatibles. – jowie

1

J'ai regardé le code source de cocos2d-x.

Il ne frappe pas avant d'envoyer l'événement tactile à la délégation tactile.
Par conséquent vous devez effectuer vous-même hit-test dans le touchBegan. (Au moins pour le type targetedDelegate)

0

Override tactile délégué:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    BOOL shouldClaimTouch = NO; 

    CGRect myRect = CGRectMake(0, 0, self.contentSize.width, self.contentSize.height); 

    CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 
    CGPoint absoluteTouch = CGPointMake(fabsf(touchLocation.x), fabsf(touchLocation.y)); 

    BOOL layerContainsPoint = CGRectContainsPoint(myRect, absoluteTouch); 
    if(layerContainsPoint) 
    { 
     shouldClaimTouch = YES; 
     NSLog(@"Sprite was touched!"); 
     [self fireEvent]; 
    } 

    return shouldClaimTouch; 
}