【问题标题】:[C#][XNA 3.1] How can I host two different XNA windows inside one Windows Form?[C#][XNA 3.1] 如何在一个 Windows 窗体中托管两个不同的 XNA 窗口?
【发布时间】:2010-03-14 21:43:54
【问题描述】:

我正在为基于 2D 瓷砖的游戏制作地图编辑器。我想在 Windows 窗体中托管两个 XNA 控件——第一个渲染地图;第二个渲染图块集。我使用代码here 在Windows 窗体内制作XNA 控制主机。这一切都很好——只要 Windows 窗体内只有一个 XNA 控件。但我需要两个 - 一个用于地图;第二个用于tileset。如何在 Windows 窗体中运行两个 XNA 控件?在谷歌搜索时,我遇到了“交换链”和“多个视口”这些术语,但我无法理解它们,希望得到支持。

顺便说一句,我知道 XNA 控件示例的设计目的是即使您运行 100 个 XNA 控件,它们都将共享同一个 GraphicsDevice - 本质上,所有 100 个 XNA 控件将共享同一个屏幕。我尝试修改代码为每个 XNA 控件实例化一个新的 GraphicsDevice,但其余代码不起作用。代码有点长,所以我不会发布,除非有人需要它来帮助我。

提前致谢。

【问题讨论】:

  • 问题中引用的链接确实显示了如何做 OP 说他想做的事情。 (WinForms Series 1 Graphics Device.) 基本代码在 GraphicsDeviceControl.OnCreateControl:graphicsDeviceService = GraphicsDeviceService.AddRef(Handle, ClientSize.Width, ClientSize.Height); 中。在此之后,graphicsDeviceService.GraphicsDevice 是绘制到该控件中的 GraphicsDevice。创建其中两个,您就有两个控件可供绘制 - 如示例代码所示。
  • ... 如果您不想按原样使用该示例,您只需要对每个控件进行一些引用即可;将myControl.Handle 放在上面的行中以创建一个GraphicsDeviceService,其GraphicsDevice 吸引到myControl。 (如果使用 ContentManager,您还需要下一行,services.AddService<IGraphicsDeviceService>(graphicsDeviceService);)。

标签: c# winforms xna


【解决方案1】:

我做了一些类似于你正在尝试做的事情。你需要做的就是告诉图形设备在哪里呈现你渲染的“东西”。为此,您可以向它传递一个指向画布的指针。

这是一个示例表单类:

public class DisplayForm : Form
{

    IntPtr canvas;
    Panel displaypanel;

    public Panel DisplayPanel
    {
        get { return displaypanel; }
        set { displaypanel = value; }
    }

    public IntPtr Canvas
    {
        get { return canvas; }
        set { canvas = value; }
    }

    public DisplayForm()
    {
        displaypanel = new Panel();
        displaypanel.Dock = DockStyle.Fill;

        this.canvas = displaypanel.Handle;
        this.Controls.Add(displaypanel);
    }

}

然后只需将其添加到您的游戏类绘制调用中:

graphics.GraphicsDevice.Present(displayform.Canvas);

完成对 DisplayForm 实例的绘制后,您可以清除、渲染其他内容,然后再次调用 Present 以指向另一个画布。

【讨论】:

  • 如果您在同一个表单上渲染到多个面板中,此方法是否有效?
【解决方案2】:

【讨论】:

  • 这就是这样做的方法。第一个系列 IIRC 显示了一个拆分面板,其中左右面板包含一个从 GraphicsDeviceControl 派生的图形控件(从 Control 派生)。
  • @IAbstract 是正确的:即使 OP 引用了相同的链接,并说他无法让它与两个 XNA 控件一起使用,该链接确实显示了如何做OP说他想做的事; OP 必须错误地将示例合并到他的代码中。基本代码在 GraphicsDeviceControl.OnCreateControl:graphicsDeviceService = GraphicsDeviceService.AddRef(Handle, ClientSize.Width, ClientSize.Height); 中。在此之后,graphicsDeviceService.GraphicsDevice 是绘制到该控件的 GraphicsDevice。
【解决方案3】:

只是一个想法,但您是否考虑过将您的这个应用程序作为 MDI 应用程序?

这样您可以多次加载包含 1 个 xna 实例的表单。

如果失败了……就按照 RodYan 的建议去做:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多