我正在制作基于2D平铺的游戏的地图编辑器。我想在Windows窗体中托管两个XNA控件 - 第一个渲染地图;第二个渲染tileset。我使用代码here在Windows窗体中创建XNA控件主机。这一切都很好 - 只要Windows窗体中只有一个XNA控件。但我需要两个 - 一个用于地图; tileset的第二个。如何在Windows窗体中运行两个XNA控件?谷歌搜索时,我遇到了“交换链”和“多个视口”这两个术语,但我无法理解它们并希望得到支持。
正如旁注,我知道XNA控件示例的设计使得即使您运行100个XNA控件,它们也将共享相同的GraphicsDevice - 实际上,所有100个XNA控件都将共享同一个屏幕。我尝试修改代码以为每个XNA控件实例化一个新的GraphicsDevice,但其余的代码不起作用。代码有点长,所以除非有人需要它才能帮助我,否则我不会发布它。
提前致谢。
答案 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)
您可能会发现这两个XNA示例很有用:
答案 2 :(得分:1)
只是一个想法,但你考虑过让你的应用程序成为MDI应用程序吗?
通过这种方式,您可以多次加载包含xna实例的表单。
失败了......做RodYan建议的事情:)