11

アンカーポイントの表示に関する以前の質問に続く質問として、CCSpriteをサブクラス化し、その描画メソッドを次のように変更しました。

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

これはうまくいきます。追加のクレジットとして、バウンディングボックスを表示するために以下を追加しました。

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

これも、スプライトの親を変更するまではうまく機能します。

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

スプライトは適切な位置にあり、アンカーポイントは適切な場所に描画されますが、バウンディングボックスは間違った場所に描画されます。私は何が間違っているのですか?

4

2 に答える 2

20

ノードのバウンディングボックスは、その親を基準にしています。drawメソッドで行われる描画はノードのローカルスペースにあります。convertToNodeSpace:座標を、親の空間からではなく、ワールド空間からローカル空間に変換します。

このノードの同じ「ワールド」位置を維持しながら、異なる原点を持つ親にノードを再ペアレント化すると、そのバウンディングボックスの原点が変更されます。

間違いは、スプライトのバウンディングボックスを、その座標がワールド空間にあるかのように扱うことです。

次に、スプ​​ライトのバウンディングボックスを描画するために、xスペースへの変換ダンスを行う必要はありません。プロジェクトのcocos2dフォルダーにあるccConfig.hファイルを開き、変更します

#define CC_SPRITE_DEBUG_DRAW 0

にライン

#define CC_SPRITE_DEBUG_DRAW 1

sprite.position第3に、ポイントの座標は、スプライトではなく、その親を基準にしています。を呼び出すと、ノードのローカルスペースにあるかのように[node convertToWorldSpace:aPoint]扱われます。aPointノードの位置のワールド座標を取得する場合は、convertToWorldSpace:ノードの親を呼び出す必要があります:[node.parent convertToWorldSpace:node.position]

于 2012-08-27T09:42:30.433 に答える
4

私は通常、AABBを次のように描画します。

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

注:Rect aabbサイズが(0,0)の場合、長方形は描画されません。

于 2016-12-27T23:44:00.847 に答える