【问题标题】:XNA and Windows FormsXNA 和 Windows 窗体
【发布时间】:2014-07-31 14:45:23
【问题描述】:

我正在尝试在 Windows 窗体中创建一个主菜单。当您单击表单中的标签时,XNA 游戏应该开始播放。 但它没有用。 我在 program.cs 中的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace _2DSpaceShooter  
{
    if WINDOWS || XBOX
    static class Program
    {

        static void Main(string[] args)
        {

            Application.Run(new MainMenu());
        }
    }
    endif
}

我在标签点击事件中的代码

private void label1_Click(object sender, EventArgs e)
{
    using (Game1 game = new Game1())
    {
        game.Run();
    }
}

请帮帮我!!! 对于可能出现的英语错误,我深表歉意(我不是美国人)

【问题讨论】:

  • 点击标签时会发生什么?即使游戏在此时出现,我希望在 click 事件处理程序中调用 Game.Run 将进入游戏循环并且永远不会返回,从而使您的 WinForms UI 无法响应任何其他用户输入。您可能应该在事件处理程序中生成一个新线程并让它创建游戏并调用 Run。

标签: c# winforms visual-studio xna


【解决方案1】:

我不知道你是否可以做到,但如果可以的话,最简单的方法之一就是使用GameComponents。将您的游戏制作为 GC 可以让您一次启动游戏的多个部分,而不会出现线程问题。

【讨论】:

    【解决方案2】:

    正如评论部分中提到的@eudabash,您需要在单独的线程中执行 game.Run():

    Game1 game = new Game1();
    
    Thread thread = new Thread(() =>
    {
        game.Run();
    };
    thread.Start();
    

    或者,如果您使用的是 .Net 4.0(我认为。甚至是 3.5)

    Game1 game = new Game1();
    
    Task.Factory.StartNew(() => 
    {
        game.Run();
    }
    

    可以选择将“游戏”作为 Form1 类中的一个字段,以便您可以在任何地方访问它。只需确保仅从 Game 中检索数据,并且永远不要在 Game 中编辑 UI。跨线程操作等等。如果需要,记得调用。

    【讨论】:

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