私はループ ゲーム プログラミングの経験が数年あります。私は自分のアプリケーションで Update や Draw などの関数を継続的に呼び出す定数ループを使用することに非常に慣れています。これにより、フレームごとに値を少しずつインクリメントすることで、時間の経過とともにアニメーションなどのアクションを実行できます。
しかし、WPF を扱う仕事に就いてから、そのシステムに頼りすぎていたことに気づきました。多分私は WPF に対して限定的な感覚しか持っていませんが、すべてがイベント ベースのようです。ユーザーがボタンをクリックすると、コードに通知され、コードが値を操作します。値が変化し、コードが UI に通知し、UI がレイアウトを更新します。GUI ベースのアプリケーション プログラミングではうまく機能しますが、ループ ベースのゲーム プログラミングでは些細な状況に遭遇すると、単純な動作を実装する良い方法を見つけることができずに行き詰まります。
あいまいすぎるリスクを冒して、現在の問題を例として挙げます。Windows 8 が発表された後、私は Semantic Zoom のアイデアに夢中になりました。スタート画面をいろいろいじった後、セマンティック ズームを Microsoft Surface 用の WPF4.0 に移植する作業を始めました (仕事で Surface を使用しています)。ピンチ ジェスチャを使用して、ビューのスタック内を上下に移動できるようにする簡単な例が必要です。
操作イベントを理解するために何時間も費やした後 (それについては説明しません... ブレ)、ピンチ ジェスチャに基づいてビューをスケーリングできるようになりました。特定のポイントを超えて拡大すると、「ズームアウト」ビューに戻ります。かなりクール。しかし、問題は、ユーザーがジェスチャを完了せずにズームアウトしないことにした場合、表示が小さくなることです。ビューのスケールをアニメートして、ユーザーのピンチから常に「リバウンド」し、スケール 1 に復元したいと考えています。これがループ ベースの場合は、フレームごとに 1 に向かって Lerp するだけです。しかし、WPF はすべてイベントに基づいているため、少し迷っています。
おそらく、慣性またはさまざまな操作イベントを使用して、この特定の問題に対する答えがあるでしょう (そして、私はそれを聞いてうれしいです)。さらに、WPF でより効果的に動作するように自分の考え方を再設定する方法を知りたいだけです。 . サブスクライブするイベントを知ることだけですか? アニメーションを使って私がやりたいことをする賢い方法はありますか? これらの種類のタスクを達成するためにスレッドを使用する必要がありますか、それとも不正行為ですか (信頼性がないように思えますが、WPF のスレッドでは不安定です)。
この問題は、WPF で効果を発揮するための私の最大の障壁の 1 つであると思います (まあ、これはまだ MVVM をよく知らないので、それに取り組んでいます)。私はそれを取り壊して、ループベースのゲーム プログラミング以上の効果を発揮できるようにしたいと考えています。