[C#] [XNA 3.1]如何在一个Windows窗体中托管两个不同的XNA窗口?

时间:2010-03-14 21:43:54

标签: c# winforms xna

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

正如旁注,我知道XNA控件示例的设计使得即使您运行100个XNA控件,它们也将共享相同的GraphicsDevice - 实际上,所有100个XNA控件都将共享同一个屏幕。我尝试修改代码以为每个XNA控件实例化一个新的GraphicsDevice,但其余的代码不起作用。代码有点长,所以除非有人需要它才能帮助我,否则我不会发布它。

提前致谢。

3 个答案:

答案 0 :(得分:6)

我做了类似于你想要做的事情。您需要做的就是告诉图形设备在哪里展示您渲染的“东西”。你通过传递一个指向画布的指针来做到这一点。

这是一个示例表单类:

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指向另一个画布。

答案 1 :(得分:2)

答案 2 :(得分:1)

只是一个想法,但你考虑过让你的应用程序成为MDI应用程序吗?

通过这种方式,您可以多次加载包含xna实例的表单。

失败了......做RodYan建议的事情:)