6

好的,我们开始吧。我正在尝试制作一个应用程序,使用 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,所以我不能只将纹理保存到流中并重新加载它。实际上,在尝试过之后,它有点狡猾,而且很慢,所以我宁愿不这样做。

4

1 回答 1

0

您是否看过以下官方教程/示例?

在我看来,他们应该解释一切。您甚至可以找到示例的可下载源。

于 2014-01-14T09:36:33.713 回答