SFML / C ++での要素のアニメーションの改善


7

これは個々のキャラクターや要素をアニメーション化することではありません。そのためのスプライトシートに満足しています。私が探しているのは、画面上の要素のアニメーションです。

たとえば、私のゲームが始まり、ロゴがランダムな方向から飛んで来て、それから回転するか何かで1つの位置で止まると、ゲームキャラクター(1人以上)が横から来て何らかのアクションを実行します。

私はまだ多くのプロジェクトを行っていません。完全なゲームを1つだけ書いたので、質問に正しく答えたかどうかわかりません。

私がやっていることは、要素に最初と最後の位置を与え、それに応じて要素を動かし、ステータスフラグを使用してその状態をチェックすることです。問題は、複数の方法で移動したい場合です。もちろん、状態変数を使用して移動させることもできますが、そのためのエレガントな方法が必要だと考えていました

編集:私は、World of Gooなどのアニメーションを見ています。

回答:


4

これは、時間の経過とともにオブジェクトの位置と回転を操作したいようです。AFAIK sfmlはそのままではこの機能を提供しませんが、これを自分で実装するのは非常に簡単で簡単です。

3次元シミュレーション用に同様のソリューションを構築したことがありますが、2Dグラフィカルアプリケーションにうまく変換できるはずです。

まず、あなたの二つの概念を持っている:Manipulatorそして応じてManipulatorManagerManipulator特定のオブジェクト(スプライトなど)のあらゆる種類の操作のための抽象基本クラスです。操作されるのは、位置や回転などのすべてのプロパティ、パス上を移動するなどです。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つまたは複数の回転マニピュレータを実装するのは簡単です。これらのマニピュレータを組み合わせて、組み合わせた効果を作成することもできます。

アーキテクチャの概要を明確に示していただければ幸いです。遠慮なく尋ねてください :)


それはかなり良い説明でした!ありがとうございました。簡単な質問ですが、要素クラスはManipulatorクラスから継承する必要がありますか?
tecfreak

1

コンスタンティニウスは、実際のコーディングから始めるのに最適な出発点をすでに提供していますが、ここで一般的に何をしているのかを知りたい場合は、少し補足したいと思います。

点Aから点Bへの時間の経過に伴うオブジェクトの変換は、関数f(x)をオブジェクトの位置に適用することによって行われます。ここで、xは、スプライトの現在の位置から、その間に経過した時間までの範囲です。 2フレームなど

このプロセスは通常、数値分析のサブフィールドの助けを借りて行われます補間と呼ばれるれます。

一般的な例は線形補間です。一定の開始点Aと終了点Bがわかっている場合、1つの可能な関数は単にf(t)= A +(B-A)*(t_max-t)です。ここで、

  • tは、オブジェクトがポイントAから開始してからの経過時間です
  • t_maxは、オブジェクトが宛先に到達するまでにかかる時間です
  • 0 <= t <= t_max。

ご覧のとおり、関数はベクトルを返しているので、オブジェクトの位置に問題なく適用できます。

これはもちろん、おそらく少しの血を味わって興味を起こさせるための大まかな紹介にすぎません。したがって、それについて詳しく知りたい場合は、Googleにリダイレクトします


ご回答有難うございます!私はコンスタンティニウスの答えにどのような音を立てるか考えていましたが、あなたはその点を正確に打ちました!
tecfreak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.