2012-08-27 17 views
9

Como una pregunta de seguimiento a mi pregunta anterior sobre displaying the anchor point, me subclases CCSprite y cambió su método de sorteo de la siguiente manera:¿Cómo puedo mostrar el cuadro delimitador para un CCNode en cocos2d?

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

Esto funciona muy bien. Para el crédito adicional, añadí lo siguiente para mostrar su cuadro delimitador:

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); 

Esto también funciona muy bien, hasta que Reparent un sprite:

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

Los de sprites ahora en la posición adecuada y su punto de anclaje dibuja donde debería, pero el cuadro delimitador se dibuja en el lugar equivocado. ¿Qué estoy haciendo mal?

Respuesta

18

El cuadro delimitador de un nodo es relativo a su elemento primario. El dibujo realizado en dibuja el método en espacio local del nodo. convertToNodeSpace: convierte coordenadas de mundo espacio en el espacio local, no en el espacio de los padres.

Cuando reemplaza el nodo a un elemento primario con origen diferente mientras mantiene la misma posición "mundial" de este nodo, el origen de su cuadro delimitador cambia.

Tu error es que tratas el cuadro delimitador de tu sprite como si sus coordenadas estuvieran en el espacio mundial.

En segundo lugar, no necesita hacer la danza de conversión a x para dibujar el cuadro delimitador de un sprite. ccConfig.h archivo en la carpeta abierta cocos2d de su proyecto y cambiar

#define CC_SPRITE_DEBUG_DRAW 0 

línea a

#define CC_SPRITE_DEBUG_DRAW 1 

En tercer lugar, las coordenadas del punto de sprite.position son en relación con su matriz , no con la clase Sprite. Cuando llame al [node convertToWorldSpace:aPoint], tratará aPoint como si estuviera en el espacio local del nodo. Si desea obtener coordenadas mundiales de la posición de un nodo, debe llamar al convertToWorldSpace: en padre del nodo: [node.parent convertToWorldSpace:node.position].

+0

¡Gracias! Muy esclarecedor Todo arreglado ahora. De hecho, necesito subclasificar CCSprite ya que quiero activar selectivamente cuadros delimitadores, pero tomar prestado el código de CC_SPRITE_DEBUG_DRAW y dibujar el poli formado por los vértices 'quad_.tl.vertices' hace exactamente lo que necesito. – mobopro

2

que normalmente dibujar con AABBs:

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: Si el tamaño es Rect aabb (0,0), entonces el rectángulo no se dibujará.

+1

Gran respuesta. ¡Me gusta que no requiera recompilar Cocos2d-x como lo hace el de arriba! – aardvarkk

Cuestiones relacionadas