Qual è il modo corretto di implementare il rilevamento dei colpi con sprite non rettangolari?


8

Qual è il modo corretto di implementare il rilevamento di hit o touch per gli sprite non rettangolari in Cocos2d?

Sto lavorando a un puzzle, quindi i nostri sprite hanno delle forme strane (mattoni del puzzle). A partire da ora, abbiamo implementato il "rilevamento" in questo modo:

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

So che il problema è nella parola chiave " sprite.boundingBox". C'è un modo migliore per implementarlo, o è una limitazione quando si usano gli sprite basati su .png? In tal caso, come devo procedere?

Risposte:


5

In realtà ho trovato una soluzione semplice!

Modificati gli oggetti personaggio non solo per includere informazioni e sprite, ma anche un CGPath. Quindi implementato un metodo per eseguire il ciclo di tutti gli oggetti carattere e verificarne la presenza

CGPathContainsPoint( params ...)

invece per

CGRectContainsPoint( params ...)

Tutorial che ho usato: http://www.youtube.com/watch?v=HxHZwzaadNQ - "La magia di CGPath"


3

Non ho familiarità con l'obiettivo C, quindi non posso fornire alcun codice specifico. Ma il modo generale per realizzare cose del genere è eseguire un controllo delle collisioni per pixel. Fondamentalmente funziona proprio come lo hai basato sul rettangolo, ma prima di lanciare l'evento touch, devi scorrere tutti i pixel che sono stati toccati e assicurarti che almeno uno di essi non sia trasparente. Ciò dovrebbe aiutarti ad avvicinarti alla risposta, si spera che qualcun altro possa darti alcuni esempi di codice reali sull'argomento.

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.