Was ist der richtige Weg, um die Treffererkennung mit nicht rechteckigen Sprites zu implementieren?

8

Was ist der richtige Weg, um die Treffer- oder Berührungserkennung für nicht rechteckige Sprites in Cocos2d zu implementieren?

Ich arbeite an einem Puzzle, daher haben unsere Sprites einige seltsame Formen (Puzzle-Steine). Ab sofort haben wir die "Erkennung" folgendermaßen implementiert:

- (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;
}

Ich weiß, dass das Problem im Schlüsselwort " sprite.boundingBox" liegt. Gibt es eine bessere Möglichkeit, dies zu implementieren, oder gibt es eine Einschränkung bei der Verwendung von Sprites, die auf PNGs basieren? Wenn ja, wie soll ich vorgehen?

hogni89
quelle

Antworten:

5

Ich habe tatsächlich eine einfache Lösung gefunden!

Die Charakterobjekte wurden so geändert, dass sie nicht nur Informationen und Sprite, sondern auch einen CGPath enthalten. Implementierte dann eine Methode, um alle Zeichenobjekte zu schleifen und nach zu suchen

CGPathContainsPoint( params ...)

anstatt von

CGRectContainsPoint( params ...)

Tutorial, das ich verwendet habe: http://www.youtube.com/watch?v=HxHZwzaadNQ - "Die Magie von CGPath"

hogni89
quelle
3

Ich bin mit Ziel C nicht vertraut, daher kann ich keinen bestimmten Code angeben. Der allgemeine Weg, um solche Dinge zu erreichen, ist eine Kollisionsprüfung pro Pixel. Grundsätzlich funktioniert es genauso, wie Sie es basierend auf dem Rechteck haben, aber bevor Sie das Berührungsereignis auslösen, müssen Sie alle berührten Pixel durchlaufen und sicherstellen, dass mindestens eines davon nicht transparent ist. Das sollte Ihnen helfen, der Antwort näher zu kommen. Hoffentlich kann Ihnen jemand anderes einige aktuelle Codebeispiele zu diesem Thema geben.

Kevin DiTraglia
quelle