1

私は現在、特定のオブジェクトの多数のパブリックプロパティをアニメーション化しようとしています。通常、これらはfloat型またはfloatのベクトルです(型はコンパイル時に認識されます)。次のことができるようになりたい:

  1. それらに静的な値を割り当てます(MyObject.Duration = 10f;)または
  2. 最小値と最大値を指定し、オプションで重みも指定して、ランダムな値を割り当てます(MyObject.Duration = new RandomFloat(5f、20f、2f);)または
  3. このプロパティを別のオブジェクトのプロパティに「バインド」します(子オブジェクトが、色、サイズ、sthなど、そのプロパティの一部を親オブジェクトにバインドするとします)。
  4. ある種のキーフレームアニメーションをそれらに割り当て、タイムコードとその特定の時点でのプロパティの値、およびこれらのフレーム間の補間方法に関する情報を使用して、可変数のキーフレームを指定します。

キーフレームは、時間とプロパティの値の両方について、フレームごとにランダムな値を受け入れることができる必要があります。

この種のシステムの実際的なアプローチは何でしょうか?現在、私はポリモーフィズムについて考えています。パブリックのValueプロパティやGetValue(float time)メソッドを使用して基本クラスまたはインターフェイスを実装し、この基本クラスまたはインターフェイスを実装するStaticValue、RandomValue、BindingValue、AnimatedValueなどのさまざまなサブクラスを作成します。 。ただし、あまりエレガントではないようです。単純なオブジェクトでさえ、初期化は少し面倒になります。

もう1つのアイデアは、これらのプロパティを通常の浮動小数点数またはベクトルと同じように実装し、これらのプロパティにバインドする特別な「修飾子」タイプを作成することです。プロパティの「実際の」値を取得するには、最初にプロパティにバインドされたModifierを呼び出します。これにより、後で取得できるように実際のオブジェクトのプロパティが更新されます。これはおそらく、ある時点でリフレクションを使用することを意味します。これは、1秒間に数十回更新する数千のプロパティがあるため、パフォーマンスにかなり悪影響を与える可能性があります。

これに関する提案はありますか?初心者である私は、(願わくば)私がすでに遊んでいるよりもはるかにエレガントで実用的な解決策を見逃しています:(

編集: おそらく以前にこれについて言及したはずですが、WPFはオプションではありません-すべてのターゲットプラットフォームで利用できるわけではないので、私はそれに頼ることができません。私はその強力なデータバインディングとアニメーション機能を知っていますが、私は自分自身を転がす必要があります(または私のニーズを満たす他の軽量の代替手段を見つける必要があります)。

4

1 に答える 1

1

あなたが説明する多形ソリューションは、これを行うための最もエレガントなOO-wayだと思います。あなたはそれについて何がエレガントでないと思いますか?

実際のデータ型と修飾子の種類の使用については、暗黙的な演算子のオーバーロードの使用を検討することをお勧めします。

必要なすべての動作を使用してクラスを定義できますが、「値」型との間の変換を提供するため、その型であるかのように値を取得/割り当てることができます。例が役立ちます:

public class MyFloat
{
    float innerValue;

    // private constructor; instantiate using a float directly
    private MyFloat(float innerValue) { this.innerValue = innerValue; }

    public string Description { get { return "some metadata"; } }

    public int NumberOfFrames { get; set; }

    // conversion from MyFloat to float
    public static implicit operator float(MyFloat mine)
    {
        return mine.innerValue; // you can access private members here
    }

    // conversion from float to MyFloat
    public static implicit operator MyFloat(float val)
    {
        return new MyFloat(val); // use the private constructor
    }
}

使用法では、次のようなことができます。

MyFloat mine = 9f; 
mine.NumberOfFrames = 15;

または…</p>

if(mine > 0f)…

インスタンス化の退屈さに関しては、この種のシナリオは内部DSL/流暢なインターフェースの完璧な候補だと思います。

次のように、表現力豊かで簡潔なものを作成できます。

var animatedObject = Sprite.with(RandomMotion.animatated_between(0f).and(10f))
    .lasts(4).seconds;
var otherObject = Sprite.with<NoMotion>().starts_at(100, 0);
var yetAnother = Sprite.with(SteadyMotion.at(7f))
    .starts_at(100, 200)
    .weighing(.5f)
    .lasts(15).frames;
于 2011-01-03T21:45:13.357 に答える