0

最近、SFMLを使用して複数のスプライトを保持するクラスをプログラムしようとしたときに、軽度の問題が発生しました。

複数のスプライトを含むコンテナがあり、各スプライトは、コンテナの中心点からのスケール、回転、および位置のオフセットを持つことができます。ただし、コンテナを回転させようとすると問題が発生します。個々のスプライトを回転させるだけでは、コンテナの中心からのオフセットは考慮されません(一部のユーザーインターフェイスビットでは、これが問題になります)。少し掘り下げた後、中心から角度を取得し、回転したときに最終的に配置される位置を計算する方法を発見しました。しかし、私は彼らの回転を同じに保つ方法がわかりません。基本的にこれができるようになりたい

ここに画像の説明を入力してください

そして回転するとこんな感じになります

ここに画像の説明を入力してください

SFMLが回転と原点を処理する方法のため、各スプライトの原点をコンテナの中心に設定して回転することはできません。私は、彼らがどこに行くべきか、そして彼らがすでに持っていたものに対して彼らが持つべき方向を計算するある種の関数を持っている必要があります(したがって、スプライトの角度が0の場合、コンテナが90度回転すると、現在、角度は90度です。90度で開始した場合は、コンテナ内の残りのスプライトに対する回転を維持するために、後で180度回転する必要があります)

回転したときにコンテナに対して相対的な位置を取得するために使用しているコードは次のとおりです。

float angle = atan2(p1.y -p2.y, p1.x - p2.x);
float x     = radius * cos(angle);
float y     = radius * sin(angle);

icon.set_position(x + spriteX, y + spriteY);

読んでくれてありがとう。私は数学がこれほど上手だったことがないので、これを自分で理解する方法がわかりません。この問題の研究を始めるまで、私はどこにどんなコスと罪があるのか​​さえ知りませんでしたxxどんな助けもいただければ幸いです。

4

2 に答える 2

1

スプライトの位置を動かさずにスプライトを回転させる方法を知っていますか?その場合は、実際のスプライト自体を、上の円に配置したときと同じ角度で回転させます。現在、sinとcosを使用して位置を回転しています。また、次の方法で計算したのと同じ角度で「方向」を設定する必要があります。float angle = atan2(p1.y - p2.y, p1.x - p2.x);

幸運を!

-pBlack

于 2013-02-07T02:27:43.133 に答える
0

シンプルで、コンテナの中心点からスプライトへのベクトルを作成します。次に、ベクトルを回転させると、新しいスプライトの位置がわかります。

于 2013-02-07T03:17:10.710 に答える