Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# cxna-用户输入_C#_Xna_File Browser - Fatal编程技术网

C# cxna-用户输入

C# cxna-用户输入,c#,xna,file-browser,C#,Xna,File Browser,我正在用C XNA进行3D模拟,我使用图像\文本文件加载数据 我想为用户提供选择文件的选项,然后我的模拟将加载并使用该文件。用cxna是不可能的 我能够使用教程将3D XNA应用程序嵌入WinForm中,这对我来说很有效,但问题是基于键盘的交互根本不顺畅。它不再像游戏一样反应了 如何在游戏中实现文件浏览和按钮等其他功能 我可以有一个逻辑来监控用户的输入,并使用它来提供像游戏中的文件浏览这样的功能,但这太麻烦了。实现这一目标是否容易。如果不使用XNA,则可能采用其他方式,如常规XNA中的Direc

我正在用C XNA进行3D模拟,我使用图像\文本文件加载数据

我想为用户提供选择文件的选项,然后我的模拟将加载并使用该文件。用cxna是不可能的

我能够使用教程将3D XNA应用程序嵌入WinForm中,这对我来说很有效,但问题是基于键盘的交互根本不顺畅。它不再像游戏一样反应了

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

我可以有一个逻辑来监控用户的输入,并使用它来提供像游戏中的文件浏览这样的功能,但这太麻烦了。实现这一目标是否容易。如果不使用XNA,则可能采用其他方式,如常规XNA中的DirectX。游戏类通常以每秒60帧的速度定期调用绘制和更新函数

XNA WinForms示例的工作方式略有不同。没有更新/绘制循环。取而代之的是一个Draw函数。只有当控件需要重新绘制时才调用该函数。这意味着:

您没有机会定期调用Keyboard.GetState,如果这是您进行键盘输入的方式的话

即使您使用的是事件驱动的非XNA输入,您的窗口也不会定期重新绘制,因此在XNA控件最终重新绘制之前,您可能无法实际看到输入的结果

幸运的是,有一种方法可以强制控件快速重新绘制。请看第二页。你会发现它正在制作动画,换句话说:它正在频繁更新。它是如何做到的?查看ModelViewerControl.cs中的以下代码:

它使用秒表来跟踪经过了多少时间,因为没有游戏类可以帮你完成。并且它在Application.Idle事件上失效——换句话说,当它不忙于处理某个内容时,它会要求重新绘制

当然,第一个WinForms示例的文档中已经解释了这一点。在底部的“动画”下


另一个额外的答案是:在常规XNA游戏中使用WinForms中的OpenFileDialog没有什么可以阻止您。只需添加对System.Windows.Forms的引用,创建该对象的实例,在其上设置适当的属性,然后调用ShowDialog。

您使用哪种输入方法?Windows窗体鼠标和键盘事件,还是XNA输入处理?我猜是因为教程,您尝试使用WinForms事件。虽然可以使它平滑。您还可以使用XNA的输入处理。也许你可以为你的实际输入处理提供更多的代码。在没有看到你正在做什么的情况下,这可能是一个你需要双重缓冲winform的问题吗?我是不是很愚蠢。。备选奖金答案我为什么不这么做。。哈哈,非常感谢。这意味着我还可以添加菜单条等等。我会处理任何需要从XNA游戏中提取表单对象的事情。文件对话框没有,但我想添加菜单条等会有。对不起,我不明白你的意思,可能是因为英语不是我的第一语言。。很抱歉您是否可以重新表述您最后的评论,以添加您通常设置的MenuStrip Form.main MenuStrip。但是从XNA窗口获取表单对象通常是不应该做的事情,即使可以。
protected override void Initialize()
{
    // Start the animation timer.
    timer = Stopwatch.StartNew();

    // Hook the idle event to constantly redraw our animation.
    Application.Idle += delegate { Invalidate(); };
}