¿Cuál es la forma correcta de implementar la detección de golpes con sprites no rectangulares?


8

¿Cuál es la forma correcta de implementar la detección de golpe o toque para sprites no rectangulares en Cocos2d?

Estoy trabajando en un rompecabezas, por lo que nuestros sprites tienen algunas formas extrañas (ladrillos de rompecabezas). A partir de ahora, hemos implementado la "detección" de esta manera:

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

Sé que el problema está en la palabra clave " sprite.boundingBox". ¿Hay una mejor manera de implementar esto, o es una limitación cuando se usan sprites basados ​​en .png? Si es así, ¿cómo debo proceder?

Respuestas:


5

En realidad encontré una solución simple!

Cambió los objetos de caracteres para no solo incluir información y sprite, sino también un CGPath. Luego implementó un método, para recorrer todos los objetos de caracteres y verificar

CGPathContainsPoint( params ...)

en lugar de

CGRectContainsPoint( params ...)

Tutorial que utilicé: http://www.youtube.com/watch?v=HxHZwzaadNQ - "La magia de CGPath"


3

No estoy familiarizado con el objetivo C, por lo que no puedo dar ningún código específico. Pero la forma general de lograr cosas como esta es haciendo una verificación de colisión por píxel. Básicamente funciona igual que como lo tiene basado en el rectángulo, pero antes de disparar el evento táctil, debe recorrer todos los píxeles que se tocaron y asegurarse de que al menos uno de ellos no sea transparente. Eso debería ayudarlo a acercarse a la respuesta, es de esperar que alguien más pueda darle algunos ejemplos de códigos reales sobre el tema.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.