我有一个简单的XNA 4.0游戏。我想创建一个Windows窗体用户控件,以渲染此游戏,并将必要的交互反馈(键盘和鼠标)发送回XNA。
我尝试了以下方法:
在XNA中:
- 将XNA的Game.GraphicsDevice重定向到RenderTarget2D。 - 在Update()开始时发送带有KeyboardState和MouseState对象的事件,由Windows Forms填充。
在WinForms中:
- 捕获事件,使用Windows Forms中通常的键盘和鼠标事件获取数据并填充KeyboardState和MouseState对象。 - 在OnPaint中调用Game.RunOnFrame()。 - 从游戏中获取RenderTarget2D(作为纹理)。 - 锁定纹理的数据,并尝试逐像素地绘制到我的用户控件的Graphics上。 - 另一个想法是只调用Game.Run(或一个新线程)并在Game中发送RenderTarget2D的事件。
我遇到了以下问题:
- 如果我调用Game.Run(),我没有隐藏游戏窗口的方法(因为我正在重定向渲染)。 - 必须在不同的线程上调用Game.Run(),因为它启动了一个新的事件循环(它调用Application方法),然后我从不同的线程中绘制我的用户控件(这很糟糕)。 - 使用Color、Vector4甚至Rgba32锁定RenderTarget2D对我来说似乎不起作用(它会显示“结构大小错误”)。
有什么想法吗?
提前感谢。
我尝试了以下方法:
在XNA中:
- 将XNA的Game.GraphicsDevice重定向到RenderTarget2D。 - 在Update()开始时发送带有KeyboardState和MouseState对象的事件,由Windows Forms填充。
在WinForms中:
- 捕获事件,使用Windows Forms中通常的键盘和鼠标事件获取数据并填充KeyboardState和MouseState对象。 - 在OnPaint中调用Game.RunOnFrame()。 - 从游戏中获取RenderTarget2D(作为纹理)。 - 锁定纹理的数据,并尝试逐像素地绘制到我的用户控件的Graphics上。 - 另一个想法是只调用Game.Run(或一个新线程)并在Game中发送RenderTarget2D的事件。
我遇到了以下问题:
- 如果我调用Game.Run(),我没有隐藏游戏窗口的方法(因为我正在重定向渲染)。 - 必须在不同的线程上调用Game.Run(),因为它启动了一个新的事件循环(它调用Application方法),然后我从不同的线程中绘制我的用户控件(这很糟糕)。 - 使用Color、Vector4甚至Rgba32锁定RenderTarget2D对我来说似乎不起作用(它会显示“结构大小错误”)。
有什么想法吗?
提前感谢。