【问题标题】:How to run multiple plug-in-like XNA games in one WinForms window如何在一个 WinForms 窗口中运行多个类似插件的 XNA 游戏
【发布时间】:2013-06-17 14:05:06
【问题描述】:

我想创建一个由多个面板组成的 (WinForms) 应用程序。对于每个面板,我希望能够分配一个 .dll 文件:

那些 .dll 文件应该包含应该渲染到相应面板中的 XNA 游戏。

我可以用

加载这些游戏
var game = (Game)Activator.CreateInstance(System.Reflection.Assembly.LoadFrom(path).GetTypes()
    .First(t => t.IsSubclassOf(typeof(Game))));

现在,我不能使用game.Run(),因为它会启动第二个消息循环。

启动一个新线程也会失败,因为InvalidOperationExceptions 涉及从另一个线程访问控件。

我在网上找到的教程只能处理我自己编写的游戏并将其包含在主应用程序中,但我希望能够添加其他游戏,类似于插件。

如何让我的 WinForms 应用程序渲染那些 XNA 游戏,或者有更好的解决方案吗?

【问题讨论】:

    标签: winforms plugins dll xna message-loop


    【解决方案1】:

    我过去做过类似的事情,但我使用了DrawableGameComponents,而不是多个 XNA 项目。 您可能要考虑改用这条路线。本质上,您将能够从同一个二进制文件中调用各种 Draw() 函数。

    然后在您的表单中,您可以创建一个指向面板句柄的指针,这将用作向图形渲染器指示在何处绘制场景的一种方式:

    IntPtr panel1Handle;                
    IntPtr panel2Handle;
    IntPtr panel3Handle;
    panel1Handle = Panel1.Handle;
    panel2Handle = Panel2.Handle;
    panel3Handle = Panel3.Handle;
    

    然后,在您各自的 DrawableGameComponent.Draw() 调用中,在进行实际绘图之前设置您要绘制的区域:

    GraphicsDevice.Present(panel1Handle);
    

    【讨论】:

    • 感谢您的建议。我现在在我隐藏的游戏中创建这些DrawableGameComponents,并将它们显示在我表单的面板中。
    • 实际上,我还有一个问题:当使用多个 dll 运行游戏时,它在每个面板中只显示第一个(并且它也只加载第一个类型)。如何加载不同的类型并使其在每个面板中显示不同的DrawableGameComponent
    • @csharpler 确保在每个面板中开始各自的绘图调用之前调用 GraphicsDevice.Present(panel)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2012-09-24
    • 2013-01-10
    相关资源
    最近更新 更多