2011-07-05 35 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'游戏'的对象。文件对话框没有,但我想添加菜单条等。 –