0

私はC#XNAで3Dシミュレーションを行っています。データをロードするために、image\textファイルを使用しています。

シミュレーションがロードして使用するファイルを選択するオプションをユーザーに提供したいと思います。C#XNAでは不可能です。

このチュートリアルを使用して、3D XNAアプリをWinFormに埋め込むことができました。これはうまくいきましたが、問題は、その後、キーボードに基づく対話がまったくスムーズに行われないことです。それはもはやゲームのように反応しません。

ゲーム内でファイルブラウジングやボタンなどのすべてを実現するにはどうすればよいですか?

ユーザー入力を監視し、それを使用してゲーム内のファイルブラウジングなどの機能を提供するロジックを作成することもできますが、それは非常に面倒です。これを達成するのは簡単でしたか?XNAを使用していない場合は、DirectXのような他の方法である可能性があります

4

1 に答える 1

2

通常のXNAでは、GameクラスはあなたDrawUpdate関数を定期的に呼び出します(通常は毎秒60フレームで)。

XNAWinFormsサンプルの動作は少し異なります。更新/描画ループはありません。代わりに、取得するのはDraw関数だけです。そして、それはコントロールが再描画を必要とするときにのみ呼び出されます。この意味は:

  1. Keyboard.GetState()キーボード入力を行う方法である場合、定期的に電話をかける機会は与えられません。

  2. イベント駆動型(非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()です。

于 2011-07-05T13:48:54.860 に答える