Quelle est la bonne façon d'implémenter la détection des hits avec des sprites non rectangulaires?

8

Quelle est la bonne façon d'implémenter la détection de toucher ou de toucher pour les sprites non rectangulaires dans Cocos2d?

Je travaille sur un puzzle, donc nos sprites ont des formes étranges (briques de puzzle). Pour l'instant, nous avons implémenté la "détection" de cette façon:

- (void)selectSpriteForTouch:(CGPoint)touchLocation {  
    CCSprite * newSprite = nil;

    // Loop array of sprites
    for (CCSprite *sprite in movableSprites) {

        // Check if sprite is hit.
        // TODO: Swap if with something better.
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
            newSprite = sprite;
            break;
        }
    }
    if (newSprite != selSprite) {
        // Move along, nothing to see here
        // Not the problem
    }
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];
    return TRUE;
}

Je sais que le problème est dans le mot clé " sprite.boundingBox". Existe-t-il une meilleure façon de l'implémenter, ou est-ce une limitation lors de l'utilisation de sprites basés sur .png? Si oui, comment dois-je procéder?

hogni89
la source

Réponses:

5

J'ai en fait trouvé une solution simple!

Modification des objets de caractère pour inclure non seulement des informations et des images-objets, mais également un CGPath. Puis implémenté une méthode, pour boucler tous les objets de caractère, et vérifier

CGPathContainsPoint( params ...)

au lieu de

CGRectContainsPoint( params ...)

Tutoriel que j'ai utilisé: http://www.youtube.com/watch?v=HxHZwzaadNQ - "La magie de CGPath"

hogni89
la source
3

Je ne connais pas l'objectif C, donc je ne peux pas donner de code spécifique. Mais la manière générale d'accomplir de telles choses est de faire un contrôle de collision par pixel. Fondamentalement, cela fonctionne exactement comme vous l'avez basé sur le rectangle, mais avant de déclencher l'événement tactile, vous devez parcourir tous les pixels qui ont été touchés et vous assurer qu'au moins l'un d'entre eux n'était pas transparent. Cela devrait vous aider à vous rapprocher de la réponse, j'espère que quelqu'un d'autre peut vous donner des exemples de code réels sur le sujet.

Kevin DiTraglia
la source