2012-08-27 8 views
9

Als Folge auf Frage meiner vorherigen Frage zu displaying the anchor point, subclassed I CCSprite und seine Ziehverfahren wie folgt verändert:Wie kann ich die Begrenzungsbox für einen CCNode in cocos2d anzeigen?

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

Dies funktioniert gut. Für zusätzliche Kredite, fügte ich die nach ihrer Begrenzungsrahmen anzuzeigen:

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

Dies auch große Werke, bis ich einen Sprit Reparent:

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

Der Sprites jetzt in der richtigen Position und seinen Ankerpunktes zieht wo es sollte, aber die Bounding Box zieht an die falsche Stelle. Was mache ich falsch?

Antwort

18

Bounding-Box eines Knotens ist relativ zu seinem übergeordneten. Zeichnen erfolgt in zeichnen Methode ist in Knoten lokalen Speicherplatz. convertToNodeSpace: konvertiert Koordinaten von world Speicherplatz auf lokalen Speicherplatz, nicht aus dem Bereich der Eltern.

Wenn Sie den Knoten an einen übergeordneten Ursprung mit einem anderen Ursprung reparieren, während die gleiche "Welt" -Position dieses Knotens beibehalten wird, ändert sich der Ursprung des Begrenzungsrahmens.

Ihr Fehler besteht darin, dass Sie die Begrenzungsbox Ihres Sprites so behandeln, als ob seine Koordinaten im Weltbereich wären.

Zweitens müssen Sie nicht den Convert-to-X-Space-Tanz machen, um die Begrenzungsbox eines Sprites zu zeichnen. Öffnen ccConfig.h Datei in cocos2d Ordner Ihres Projekts und ändern

#define CC_SPRITE_DEBUG_DRAW 0 

Linie

#define CC_SPRITE_DEBUG_DRAW 1 

Drittens Koordinaten von sprite.position Punkt bezüglich zu Mutter, nicht auf das Sprite. Wenn Sie [node convertToWorldSpace:aPoint] aufrufen, behandelt es aPoint, als ob es im lokalen Bereich des Knotens wäre. Wenn Sie Weltkoordinaten der Position eines Knotens erhalten möchten, rufen Sie convertToWorldSpace: unter Knoten Eltern: [node.parent convertToWorldSpace:node.position].

+0

Vielen Dank! Sehr aufschlussreich. Alles jetzt behoben. Ich muss tatsächlich CCSprite ableiten, da ich Bounding-Boxen selektiv aktivieren möchte, aber das Ausleihen des Codes von CC_SPRITE_DEBUG_DRAW und das Zeichnen des Poly aus "quad_.tl.vertices" -Vertices macht genau das, was ich brauche. – mobopro

2

Ich ziehe normalerweise AABBs mit:

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

Hinweis: Wenn die Rect aabb Größe (0,0) ist, dann wird das Rechteck nicht gezogen werden.

+1

Große Antwort. Ich mag es, dass es nicht erfordert, Cocos2d-x neu zu kompilieren, wie das oben genannte tut! – aardvarkk