通常のXNAでは、Game
クラスはあなたDraw
とUpdate
関数を定期的に呼び出します(通常は毎秒60フレームで)。
XNAWinFormsサンプルの動作は少し異なります。更新/描画ループはありません。代わりに、取得するのはDraw
関数だけです。そして、それはコントロールが再描画を必要とするときにのみ呼び出されます。この意味は:
Keyboard.GetState()
キーボード入力を行う方法である場合、定期的に電話をかける機会は与えられません。
イベント駆動型(非XNA)入力を使用している場合でも、ウィンドウは定期的に再描画されないため、XNAコントロールが最終的に再描画されるまで、入力の結果が実際に表示されない場合があります。
幸い、コントロールを強制的に再描画する方法があります。それらのWinFormsサンプルの2番目を見てください。あなたはそれがアニメートしていることに気付くでしょう(言い換えれば、それは頻繁に更新されています)。それはどのようにそれをしますか?からこのコードを見てくださいModelViewerControl.cs
:
protected override void Initialize()
{
// Start the animation timer.
timer = Stopwatch.StartNew();
// Hook the idle event to constantly redraw our animation.
Application.Idle += delegate { Invalidate(); };
}
を使用して、Stopwatch
経過時間を追跡します(これGame
を行うクラスがないため)。そして、それはApplication.Idle
イベントで無効になります-言い換えれば、何かを処理するのに忙しくないときはいつでも、それは再描画を要求します。
(もちろん、これは最初のWinFormsサンプルのドキュメントですでに説明されています。下部の[アニメーション]の下にあります。)
代替のボーナス回答:OpenFileDialog
通常のXNAゲーム内でWinFormsを利用することを妨げるものは何もありません。への参照を追加しSystem.Windows.Forms
、オブジェクトのインスタンスを作成し、それに適切なプロパティを設定して、を呼び出すだけShowDialog()
です。