2011-07-05 27 views
1

C#XNAで3Dシミュレーションを作成していますが、画像\テキストファイルを使用してデータを読み込みます。C#XNA - ユーザー入力

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

3D XNAアプリケーションをthisチュートリアルを使用してWinFormに埋め込むことができましたが、それは私にとっては効果的でしたが、問題はキーボードによる相互作用がまったく滑らかでないことです。それはゲームのようにもう反応しません。

どのようにしてゲーム内でボタンブラウジングやその他の操作を行うことができますか?

私はユーザーの入力を監視し、ゲームでのファイル閲覧のような機能を提供するためにそれを使用するロジックを持つことができますが、それはあまりにも面倒です。これを達成するのは簡単でしたか?ないXNAであれば、通常のXNAでのDirectX

+0

これは、あなたがwinformを二重にバッファリングする必要がある場合、これが問題である可能性がありますか? – Maynza

+0

どの入力方法を使用していますか? Windowsフォームのマウスとキーボードのイベント、またはXNAの入力処理? チュートリアルのために、WinFormsイベントを使用しようとしています。それを滑らかにすることは可能ですが。また、XNAの入力処理を使用することもできます。 実際の入力処理のために、より多くのコードを提供することができます。 – dowhilefor

答えて

2

のようないくつかの他の方法かもしれGameクラスは、定期的に(通常は毎秒60のフレームで)あなたのDrawUpdate関数を呼び出します。

XNA WinFormsのサンプルは、わずかに異なります。 更新/描画ループはありません。代わりに、Drawの機能しか使用できません。これは、コントロールを再描画する必要がある場合にのみ呼び出されます。あなたがキーボード入力を行っているかそれがある場合は、定期的にKeyboard.GetState()を呼び出すための機会を与えられていない

  1. :これはことを意味します。あなたはイベント駆動型(非XNA)入力を使用している場合でも、XNAコントロールはかなり後に最終的に再描画されるまで、あなたが実際にがあなたの入力の結果が表示されない場合がありますので、あなたの窓を定期的に再描画されることはありません

幸運にも、コントロールを強制的に高速に再描画する方法があります。 those WinForms samplesの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(); }; 
} 

それは(あなたのためにそれを行うにはGameクラスがありませんので)経過時間を追跡するStopwatchを使用しています。そして、Application.Idleイベントで無効になります。つまり、何かを処理していないときはいつでも、再描画を要求します。

(。。もちろん、これはすでにその最初のWinFormsサンプルのドキュメントで説明されて底部では、「アニメーション」の下では)

代替ボーナス答え:を利用することからあなたを止めるものは何もありません通常のXNAゲーム内のWinFormsのOpenFileDialogSystem.Windows.Formsへの参照を追加し、オブジェクトのインスタンスを作成し、適切なプロパティを設定してShowDialog()を呼び出します。

+0

私は愚かか何か.. "代替ボーナスの答え"なぜ私はそれをやっていません.. lolsありがとうたくさん – Moon

+0

これは私もメニューストリップなどを追加することができることを意味する – Moon

+0

私はあなたが ' Form'オブジェクトをXNA 'Game'から取得します。ファイルダイアログはありませんが、メニューストリップの追加などは想像しています。 –