【发布时间】:2012-01-05 18:13:00
【问题描述】:
我编写了一个简单的 XNA 4.0 游戏。我想制作一个 Windows 窗体用户控件来渲染这个游戏,并向 XNA 提供必要的交互反馈(键盘和鼠标)。
我尝试了以下方法:
在 XNA 中:
将 XNA 的 Game.GraphicsDevice 重定向到 RenderTarget2D。
在 Update() 的开头发送一个事件,发送一个带有 KeyboardState 和 MouseState 的对象以由 Windows 窗体填充
在 WinForms 中:
捕获事件,用 Windows 窗体中常见的键盘和鼠标事件获得的数据填充 KeyboardState 和 MouseState。
在 OnPaint 上,调用 Game.RunOnFrame()
从游戏中获取 RenderTarget2D(作为纹理)。
锁定纹理数据,并尝试在我的用户控件的图形中逐像素绘制它。
另一个想法只是调用 Game.Run()(o 一个新线程)并在 Game 中发出一个发送 RenderTarget2D 的事件。
我发现了以下问题:
如果我调用 Game.Run(),我将无法隐藏游戏窗口(显示为黑色,因为我正在重定向渲染)
Game.Run() 必须在不同的线程上调用,因为它会启动一个新的事件循环(它调用应用程序方法),然后我从创建它的不同线程在我的用户控件中进行绘制(坏,坏)
使用 Color、Vector4 甚至 Rgba32 锁定 RenderTarget2D 似乎对我不起作用(它显示“结构大小错误”)
有什么想法吗?
提前致谢。
【问题讨论】:
-
愚蠢的问题 - 你为什么要这样做?
-
我认为本教程和代码示例完全涵盖了您想要做的事情:create.msdn.com/en-US/education/catalog/sample/…
-
@RQDQ 我认为这是一个没有经过深思熟虑的评论。我能想到您可能希望在 winform 中嵌入 xna 游戏的一个原因:创建关卡编辑器。
-
@annonymously - 在理解了基本目标之后,我实际上能够更好地回答问题。如果 OP 确实想要创建关卡编辑器,那将是有用的信息。