好的,我们开始吧。我正在尝试制作一个应用程序,使用 XNA 作为基础,因为它的渲染器。在这个项目中需要做的一件事是打开一个新窗口(作为一个对话框),其中嵌入了一个单独的 XNA 渲染面板。我将它用作交互式预览面板,所以我绝对需要 XNA 在那里渲染。然而,似乎 XNA 并没有很好地做到这一点。我自己尝试了各种方法,但无济于事(产生错误且未正确渲染,或以错误的纵横比渲染等)。通常,我会在此处发布代码,但由于我运气不佳,因此没有太多可发布的内容。
我的应用程序当前包含一个嵌入在表单中的 XNA 应用程序,并且我有一个打开预览面板的按钮,理论上它应该作为一个包含 XNA 渲染器的表单对话框弹出,以允许我绘制预览。我已经尝试了几个小时,但一无所获,所以我在这里寻求一些帮助。
不管怎么说,还是要谢谢你。
编辑:好的,我取得了一些进展,但我有两个问题。首先,使用精灵批次绘制的任何纹理都显示正确的尺寸,但填充为纯黑色。此外,当我打开对话框,然后关闭它并关闭应用程序时,我得到一个 AccessViolationException。我强烈怀疑这两个错误以某种方式联系在一起。
这是我初始化预览对话框的代码。(a 是一个自定义类,本质上由 Texture2D 对象的 LinkedList 组成)。
animPrev = new AnimationPreview(a);
animPrev.Show();
我的 AnimationPreview 类是 Form 类的扩展,并且包含一个 PreviewControl 对象,它是 XNA Winforms 示例中的 GraphicsDeviceControl 的扩展。请注意,出于各种原因,我的主窗体扩展了 XNA Game 类。
PreviewControl 对象的设置如下:
protected override void Initialize()
{
sb = new SpriteBatch(GraphicsDevice);
Application.Idle += delegate { Invalidate(); };
}
Draw 方法包含:
protected override void Draw()
{
GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet);
if (frame != null)
{
sb.Begin();
sb.Draw(Image, Vector2.Zero, Color.White);
sb.End();
}
}
正如预期的那样,这将清除表单紫罗兰色的背景,并绘制一个与 Image 大小相同的黑框。这不是预期的。希望有人可以在这里帮助我。
注意:可接受的替代方法是将 XNA Texture2D 对象转换为 System.Drawing.Image 对象。但是,我使用的是 XNA 3.1,所以我不能只将纹理保存到流中并重新加载它。实际上,在尝试过之后,它有点狡猾,而且很慢,所以我宁愿不这样做。