これは、時間の経過とともにオブジェクトの位置と回転を操作したいようです。AFAIK sfmlはそのままではこの機能を提供しませんが、これを自分で実装するのは非常に簡単で簡単です。
3次元シミュレーション用に同様のソリューションを構築したことがありますが、2Dグラフィカルアプリケーションにうまく変換できるはずです。
まず、あなたの二つの概念を持っている:Manipulator
そして応じてManipulatorManager
。Manipulator
特定のオブジェクト(スプライトなど)のあらゆる種類の操作のための抽象基本クラスです。操作されるのは、位置や回転などのすべてのプロパティ、パス上を移動するなどです。Manager
状態を監視Manipulators
し、それらをフレームごとに更新されます。
マニピュレーターのインターフェースは次のようになります。
class Manipulator {
public:
Manipulator(float expiration_time) : expiration_time(expiration_time);
bool is_expired() { return expiration_time < 0.f; }
void update(float dt) { this->expiration_time -= dt; }
protected:
float expiration_time;
}
このクラスの実装はSimpleLineManipulator
、直線上の特定の時間におけるスプライトの位置に影響を与えるクラスです。
class SimpleLineManipulator {
SimpleLineManipulator(Sprite *spr, Vector2f begin, Vector2f end, float expiration_time);
...
private:
Sprite* sprite;
Vector2f begin, end;
float total_time; // initialized with expiration_time
}
そして、これはupdateメソッドがどのように見えるかです(ほとんどの作業が行われる場所):
void SimpleLineManipulator::update(float dt) {
Manipulator::update(dt);
Vector2f position = lerp(end, begin, total_time/expiration_time);
spr->SetPosition(position.x, position.y);
}
あとはupdate()
フレームごとにメソッドを呼び出すだけです。パス(位置のリスト)で機能する1つまたは複数の回転マニピュレータを実装するのは簡単です。これらのマニピュレータを組み合わせて、組み合わせた効果を作成することもできます。
アーキテクチャの概要を明確に示していただければ幸いです。遠慮なく尋ねてください :)