0

に追加されるスプライトがありCCSpriteBatchNodeます。次に、スプ​​ライトの位置を修正し、アンカー ポイントを途中で変更して、そのポイントを中心にスプライトを回転できるようにします。

階層はスプライト <- batchNode <- シーン

基本的にスプライトは動いていますが、.positionプロパティは変化していません。変換後のスプライトの実際の位置を取得する必要があります。だから私は使用しようとしました

CGPoint p = sprite.position;
p = [sprite convertToWorldSpace:p];

しかし、シーンで見たスプライトの位置と位置が一致しません。

4

1 に答える 1

0

スプライトの位置は、CCSprite の中央のポイントです (デフォルト)。アンカー ポイントを変更すると、ポイントがスプライトに対して移動するが、ワールド空間に対しては同じままになるように、スプライトが移動します。たとえば、スプライト (正方形など) のアンカー ポイントを ccp(0,0) に変更すると、最初に正方形の中心点があった位置に左下の頂点が来るように正方形が移動します。そのため、正方形は「再配置」されているように見えるかもしれませんが、特に変更しない限り、その位置 (プロパティ) は同じままです (アンカー ポイントの変更の影響を受けません)。

編集

スプライトの実際の位置とは、アンカー ポイントが変更された後の中間点を意味する場合、適用された 2 つの変換、つまり平行移動と回転を考慮して計算できます。

最初にTranslationを処理します。

あなたのスプライトは次のように移動しました:

CGPoint translation;
translation.x =  sprite.contentSize.width x (0.5 - sprite.anchorPoint.x);
translation.y =  sprite.contentSize.height x (0.5 - sprite.anchorPoint.y);    

Rotationの変更に対応できるようになりました

「平行移動」点を取得した極座標に変換する

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))
r = ccpDistance(translation,ccp(0,0));
ø = RADIANS_TO_DEGREES(atan2(translation.x,translation.y)); //i take x/y here as i want the CW angle from y axis.

スプライトを「D」度回転した場合:

 ø = ø + D;
 CGPoint transPositionAfterRotation = ccp(r * cos(ø),r * sin(ø) );

CGPoint realPosition =  ccp(sprite.position.x + transPositionAfterRotation.x, sprite.position.y +transPositionAfterRotation.y)
于 2013-09-28T12:25:19.183 に答える