2011-07-05 61 views
1

我正在用C#XNA進行3D模擬,我使用image \ text文件來加載數據。C#XNA - 用戶輸入

我想提供用戶選擇一個文件,然後我的模擬將加載和使用。用C#XNA是不可能的。

我能夠在WinForm中使用this教程嵌入3D XNA應用程序,該教程適用於我,但問題在於基於鍵盤的交互並不順利。它不再像遊戲一樣響應。

我該如何在遊戲中實現文件瀏覽和諸如按鈕等全部功能?

我可以有一個邏輯來監視用戶輸入並使用它在遊戲中提供文件瀏覽等功能,但這太麻煩了。實現這一目標是否容易?如果不是用XNA則可能像的DirectX

+0

沒有看到你在做什麼有可能這是一個問題,你需要加倍緩衝winform? – Maynza

+0

您使用哪種輸入法? Windows窗體鼠標和鍵盤事件或XNA輸入處理? 我猜是因爲你嘗試使用WinForms事件。儘管可以使其平滑。您也可以使用XNA的輸入處理。 也許你可以提供更多的代碼,爲你的實際輸入處理。 – dowhilefor

回答

2

一些其他的方式在常規的XNA的Game類定期調用你DrawUpdate功能(通常以每秒60幀)。

XNA WinForms示例的工作方式稍有不同。 沒有更新/繪製循環。取而代之的是一個Draw函數。這隻有在控件需要重繪時才被調用。這意味着:

  1. 你不會有機會經常打電話Keyboard.GetState(),如果這是你是怎麼做的鍵盤輸入。

  2. 即使你使用的是事件驅動(非XNA)輸入,你的窗口不會定期,所以你可能沒有真正看到您輸入的,直到XNA控制的結果是最終重繪晚得多重繪。

幸運的是,有一種方法可以強制控件快速重繪。看看those WinForms samples的第二個。你會發現它是動畫(換句話說:它經常更新)。它是如何做到的?看看這個代碼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樣品的文件中說明在底部,「動畫」下。)

替代獎金答案:沒有什麼從利用的阻止你來自WinForms的常規XNA遊戲中的OpenFileDialog。只需添加對System.Windows.Forms的引用,創建對象的實例,在其上設置相應的屬性,然後致電ShowDialog()

+0

我是愚蠢的還是什麼..「替代獎金答案」爲什麼我不這樣做.. lols非常感謝很多 – Moon

+0

這意味着我也可以添加菜單條et ettera – Moon

+0

我會照顧任何需要你提取'形式'從XNA'遊戲'的對象。文件對話框沒有,但我想添加菜單條等。 –