【问题标题】:XNA with Windows Forms - Opening new window带有 Windows 窗体的 XNA - 打开新窗口
【发布时间】:2012-09-27 16:33:02
【问题描述】:

好的,我们开始吧。我正在尝试制作一个应用程序,使用 XNA 作为基础,因为它的渲染器。在这个项目中需要做的一件事是打开一个新窗口(作为一个对话框),其中嵌入了一个单独的 XNA 渲染面板。我将它用作交互式预览面板,所以我绝对需要 XNA 在那里渲染。然而,似乎 XNA 并没有很好地做到这一点。我自己尝试了各种方法,但无济于事(产生错误且未正确渲染,或以错误的纵横比渲染等)。通常,我会在这里发布代码,但由于我运气不佳,所以没有太多可发布的内容。

我的应用程序当前包含一个嵌入在表单中的 XNA 应用程序,并且我有一个打开预览面板的按钮,理论上它应该作为一个包含 XNA 渲染器的表单对话框弹出,以允许我绘制预览.我已经尝试了几个小时,但无济于事,所以我在这里寻求一些帮助。

无论如何,谢谢。

编辑:好的,我取得了一些进展,但我有 2 个问题。首先,使用精灵批次绘制的任何纹理都显示正确的尺寸,但填充为纯黑色。此外,当我打开对话框,然后关闭它并关闭应用程序时,我得到一个 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,所以我不能只将纹理保存到流中并重新加载它。 其实试过之后,有点狡猾,而且很慢,所以我宁愿不这样做。

【问题讨论】:

  • 您使用的是XNA WinForms Sample吗? (因为,如果不是,那将是第 1 步。)
  • 不,我去看看。
  • 嗯......这似乎几乎是我正在寻找的,但它的问题是它似乎不包含更新循环。我目前的主要形式是一个 Game 类,句柄转换为 Form 对象。我需要在这个新窗口中使用更新和绘制循环。
  • 好吧...它似乎也只允许创建一种尺寸的图形设备,这对我来说是个问题。我会进一步研究。
  • 等等!我想我明白了。我使用此 GraphicsDeviceControl 创建了一个“PreviewControl”,然后将其嵌入到预览 Winform 中。似乎工作......

标签: c# winforms dialog xna panel


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多