No Cocos2D, como verifico colisões contra uma forma arbitrária desenhada pelo usuário?

10

Quero detectar uma colisão entre um sprite e uma forma gerada pelo usuário de algum tipo.

Por exemplo. Existem 3 objetos na tela. O usuário pega o dedo e desenha uma forma anormal em torno de 2 dos objetos. Eu preciso detectar esses 2 objetos.

forma de usuário em roxo, objetos de jogo em verde e vermelho

Como abordar isso com eficiência usando o Cocos2D?

David McGraw
fonte

Respostas:

10

Existe uma solução muito fácil para esse exemplo específico.

Estou assumindo que sua forma arbitrária é apenas uma série de pontos.

Desenhe um raio de cada um dos seus objetos em qualquer direção. Se o número de vezes que ele cruzar um segmento de linha em sua forma for par (incluindo zero), você estará fora da forma.

Se o número de vezes que você cruzar for ímpar, você estará dentro do objeto.

A colisão de raio / segmento de linha é um algoritmo bastante fácil de encontrar / implementar.

Tetrad
fonte
3

Claro, eu tive que descobrir isso para o meu jogo Star Catch. Pode haver maneiras melhores de fazer isso, mas foi assim que eu fiz. Na verdade, encontrei o algoritmo on-line (desculpe, não me lembro da fonte). Fiz uma pesquisa para detectar um ponto dentro de um polígono.

Eu criei um NSMutableArray para manter meu argumento. Eu adiciono os pontos nos meus touchevents.

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

Deixe-me saber se isso é útil.

Tom
fonte
2

O livro "Detecção de colisão em tempo real" possui uma seção sobre detecção de colisão de linha / segmento. Exemplo via Google Livros: http://ow.ly/2gjQf

AlfredBaudisch
fonte
0

Para verificações de colisão pixel a pixel, há uma boa série de tutoriais no site do desenvolvedor do XNA.
http://creators.xna.com/pt-BR/tutorial/collision2dperpixeltransformed

Uma otimização que você pode usar que não foi usada nesses tutoriais (por incrível que pareça) é que, na maioria dos casos, apenas o esboço precisa ser verificado, economizando ciclos preciosos .

Editado para adicionar: Má resposta, interprete mal a pergunta. Os tutoriais ainda são bastante decentes, se você quiser ler sobre o coldet por pixel.

Kaj
fonte