En Cocos2D, ¿cómo verifico las colisiones contra una forma arbitraria dibujada por el usuario?

10

Quiero detectar una colisión entre un sprite y una forma generada por el usuario de algún tipo.

Por ejemplo. Hay 3 objetos en la pantalla. El usuario toma su dedo y dibuja una forma anormal alrededor de 2 de los objetos. Necesito detectar esos 2 objetos.

forma de usuario en púrpura, objetos del juego en verde y rojo

¿Cómo abordo esto de manera eficiente usando Cocos2D?

David McGraw
fuente

Respuestas:

10

Hay una solución muy fácil para ese ejemplo en particular.

Supongo que su forma arbitraria es solo una serie de puntos.

Dibuja un rayo de cada uno de tus objetos en cualquier dirección. Si el número de veces que se cruza con un segmento de línea en su forma es par (incluido cero), está fuera de la forma.

Si el número de veces que se cruza es impar, está dentro del objeto.

La colisión de segmento de línea / rayo es un algoritmo bastante fácil de encontrar / implementar.

Tétrada
fuente
3

Claro, tuve que resolver eso para mi juego Star Catch. Puede haber mejores formas de hacerlo, pero así es como lo hice. En realidad encontré el algoritmo en línea (lo siento, no recuerdo la fuente) Hice una búsqueda para detectar un punto dentro de un polígono.

Creé un NSMutableArray para mantener mi punto. Añado los puntos en mis eventos.

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

Avísame si esto es útil.

Tono
fuente
2

El libro "Detección de colisión en tiempo real" tiene una sección sobre detección de colisión de línea / segmento. Ejemplo a través de Google Books: http://ow.ly/2gjQf

AlfredBaudisch
fuente
0

Para las comprobaciones de colisión por píxeles, hay una buena serie de tutoriales en el sitio para desarrolladores de XNA.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Una optimización que puede usar y que no se usó en esos tutoriales (por extraño que parezca) es que en la mayoría de los casos solo es necesario verificar el esquema, ahorrando preciosos ciclos .

Editado para agregar: pésima respuesta, leyó mal la pregunta. Sin embargo, los tutoriales siguen siendo bastante decentes si desea leer sobre coldet por píxel.

Kaj
fuente