C#XNA - 用户输入

时间:2011-07-05 11:03:12

标签: c# xna file-browser

我正在使用C#XNA进行3D模拟,我使用image \ text文件加载数据。

我想为用户提供选择文件的选项,然后我的模拟将加载和使用。使用C#XNA是不可能的。

我能够使用this教程将3D XNA应用程序嵌入到WinForm中,这对我有用,但问题是在基于键盘的交互完全不顺畅之后。它不再像游戏一样响应。

如何在游戏中实现文件浏览和其他诸如按钮等功能?

我可以有一个逻辑来监控用户输入并使用它来提供游戏中的文件浏览功能,但这太麻烦了。实现这一目标是否容易?如果不是XNA,则可能是其他方式,如DirectX

1 个答案:

答案 0 :(得分:2)

在常规XNA中,Game课程会定期调用您的DrawUpdate函数(通常为每秒60帧)。

XNA WinForms示例的工作方式略有不同。 没有更新/绘制循环。而是您获得的是Draw函数。只有在控件需要重绘时才会调用它。这意味着:

  1. 如果您正在键盘输入,那么您没有机会定期拨打Keyboard.GetState()

  2. 即使您使用的是事件驱动(非XNA)输入,您的窗口也不会定期重绘,因此您可能实际上看到输入的结果,直到XNA控制最终会重新绘制。

  3. 幸运的是,有一种方法可以强制控件快速重绘。看看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示例的文档中进行了解释。在底部,在“动画”下。)

    其他奖励回答:在常规XNA游戏中,没有什么可以阻止您使用WinForms中的OpenFileDialog。只需添加对System.Windows.Forms的引用,创建对象的实例,在其上设置适当的属性,然后调用ShowDialog()