2012-08-27 13 views
9

Come una domanda di follow-on alla mia precedente interrogazione su displaying the anchor point, ho sottoclasse CCSprite e ha cambiato il suo metodo draw come segue:Come posso visualizzare il riquadro di delimitazione per un CCNode in cocos2d?

[super draw]; 
ccDrawColor4F(0, 1, 0, 1); 
ccDrawCircle(self.anchorPointInPoints, 20, 0, 8, YES); 

Questa grande opera. Per il credito supplementare, ho aggiunto il seguente per visualizzare il relativo riquadro di selezione:

CGRect bb = self.boundingBox; 
CGPoint vertices[4] = { 
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y)], 
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y)], 
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y + bb.size.height)], 
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y + bb.size.height)], 
}; 
ccDrawPoly(vertices, 4, YES); 

Questo funziona anche grande, fino a quando ho Reparent un folletto:

CGPoint oldPosition = [sprite convertToWorldSpace:sprite.position]; 
[sprite removeFromParentAndCleanup:NO]; 
[parentSprite addChild:sprite]; 
sprite.position = [sprite convertToNodeSpace:oldPosition]; 

lo sprite di ora nella posizione corretta e il suo punto di ancoraggio disegna dove dovrebbe, ma il riquadro di selezione si disegna nel posto sbagliato. Che cosa sto facendo di sbagliato?

risposta

18

La casella di delimitazione di un nodo è relativa alla sua madre. Il disegno eseguito nel metodo pareggia è nello spazio locale del nodo . convertToNodeSpace: converte le coordinate da mondo nello spazio allo spazio locale, non dallo spazio del genitore.

Quando si esegue il nodo di riparazione su un genitore con origini diverse mantenendo la stessa posizione "mondiale" di questo nodo, l'origine del relativo riquadro di selezione cambia.

Il tuo errore è che tratti il ​​riquadro del tuo sprite come se le sue coordinate fossero nello spazio del mondo.

In secondo luogo, non è necessario eseguire la danza convert-to-x-space per disegnare il riquadro di delimitazione di uno sprite. Aprire il file nella cartella ccConfig.h cocos2d del progetto e cambiare

#define CC_SPRITE_DEBUG_DRAW 0 

linea per

#define CC_SPRITE_DEBUG_DRAW 1 

In terzo luogo, le coordinate del punto sprite.position sono relative al suo genitore, non lo sprite. Quando si chiama [node convertToWorldSpace:aPoint], verrà considerato aPoint come se fosse nello spazio locale del nodo. Se si desidera ottenere le coordinate del mondo della posizione di un nodo, è necessario chiamare convertToWorldSpace: su genitore del nodo: [node.parent convertToWorldSpace:node.position].

+0

Grazie! Molto illuminante. Tutto risolto ora. In realtà ho bisogno di sottoclasse CCSprite poiché voglio attivare selettivamente i bounding box, ma prendere a prestito il codice da CC_SPRITE_DEBUG_DRAW e disegnare il poly formato dai vertici di 'quad_.tl.vertices' fa esattamente quello di cui ho bisogno. – mobopro

2

Io di solito disegnare AABBs con:

Rect aabb = someNode->getBoundingBox(); 
DrawNode* drawNode = DrawNode::create(); 
drawNode->drawRect(aabb.origin, aabb.origin + aabb.size, Color4F(1, 0, 0, 1)); 
parentNode->addChild(drawNode, 100); 

Nota: Se la dimensione è Rect aabb (0,0), allora il rettangolo non verrà disegnata.

+1

Ottima risposta. Mi piace che non richieda la ricompilazione di Cocos2d-x come quella sopra! – aardvarkk

Problemi correlati