In Cocos2D, come posso verificare la presenza di collisioni contro una forma arbitraria disegnata dall'utente?


10

Voglio rilevare una collisione tra uno sprite e una forma generata dall'utente di qualche tipo.

Per esempio. Ci sono 3 oggetti sullo schermo. L'utente prende il dito e disegna una forma anormale attorno a 2 degli oggetti. Devo rilevare quei 2 oggetti.

forma dell'utente in viola, oggetti di gioco in verde e rosso

Come posso affrontarlo in modo efficiente usando Cocos2D?

Risposte:


10

C'è una soluzione molto semplice per quel particolare esempio.

Suppongo che la tua forma arbitraria sia solo una serie di punti.

Disegna un raggio da ciascuno dei tuoi oggetti in qualsiasi direzione. Se il numero di volte in cui interseca un segmento di linea sulla tua forma è pari (incluso zero), sei fuori dalla forma.

Se il numero di volte in cui si intersecano è dispari, ci si trova all'interno dell'oggetto.

La collisione del segmento raggio / linea è un algoritmo abbastanza semplice da trovare / implementare.


3

Certo, ho dovuto capirlo per il mio gioco Star Catch. Potrebbero esserci modi migliori per farlo, ma è così che l'ho fatto. In realtà ho trovato l'algoritmo online (mi dispiace non ricordo la fonte) Ho fatto una ricerca per rilevare un punto all'interno di un poligono.

Ho creato un NSMutableArray per mantenere il mio punto. Aggiungo i punti nei miei 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;
}

Fammi sapere se questo è utile.


2

Il libro "Rilevamento delle collisioni in tempo reale" contiene una sezione sul rilevamento delle collisioni di linea / segmento. Esempio tramite Google Libri: http://ow.ly/2gjQf


0

Per i controlli delle collisioni pixel a livello c'è una bella serie di tutorial sul sito degli sviluppatori XNA.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Un'ottimizzazione che puoi usare che non è stata utilizzata in quei tutorial (stranamente) è che nella maggior parte dei casi è necessario controllare solo il contorno, salvando cicli preziosi .

Modificato per aggiungere: risposta scadente, interpretazione errata della domanda. I tutorial sono comunque abbastanza decenti se vuoi leggere su un pixel per pixel.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.