【问题标题】:C# Monogame - passing arguments on startupC# Monogame - 在启动时传递参数
【发布时间】:2015-08-18 23:56:17
【问题描述】:

所以我想为我的游戏创建一个 winforms GUI...但我似乎找不到经过测试可与 Monogame 一起使用的 GUI 库。这就是为什么我有另一个计划:

  1. 创建一个 WinForms 项目作为我的游戏的启动。
  2. 然后,当用户在该项目的主窗体中单击“开始游戏”时,winforms 项目应查找我的 Monogame 项目可执行文件并启动它,然后该窗体应关闭。
  3. 但是,我想将参数从 WinForms exe 传递给 Monogame exe。这样做的目的是在一定程度上阻止用户通过 Monogame exe 启动游戏,而改用 Winforms“Starter”。这导致第 4 步。
  4. 如果没有参数传递给 Monogame 项目,它应该关闭。

所以我应该像在控制台应用程序中那样,将一个字符串数组传递给 Monogame 应用程序的主空白,如下所示:

using System;

namespace myGame
{
#if WINDOWS || LINUX
    /// <summary>
    /// The main class.
    /// </summary>
    public static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            using (var game = new Game1())
                game.Run();
            if (args[0] != "startFromWinForms")
            {
                // Find a way to close or
                // on the other hand I think
                // it will throw an exception??
            }
        }
    }
#endif
}

你会怎么做?你推荐什么方法?解释代码示例/想法也很棒!

【问题讨论】:

    标签: c# .net winforms user-interface monogame


    【解决方案1】:

    让我们退后一步,看看你原来的需求。

    我想为我的游戏创建一个 winforms GUI ...当用户单击“开始游戏”时 [游戏将开始]

    我刚刚尝试了一个简单的解决方案,我认为它可以解决您的问题,无需创建 2 个项目。我所要做的就是:

    1. 创建一个新的 MonoGame Windows 项目。
    2. 向其中添加一个 WinForms 表单 (Form1)。
    3. 编写以下代码..

    Main() 方法中:

        [STAThread]
        static void Main()
        {
            var form = new Form1();
    
            if (form.ShowDialog() == DialogResult.OK)
            {
                using (var game = new Game1())
                    game.Run();
            }
        }
    

    Form1按钮点击事件中:

        private void StartGameButton_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.OK;
        }
    

    就是这样。您不需要在命令行上传递任何内容。您将只有 1 个 exe,它满足所有要求。 MonoGame 的工作方式与现在完全一样,并且 WinForms 代码与游戏保持隔离。

    【讨论】:

    • 我不是winforms方面的专家,但有没有办法用普通形式而不是对话框来做逻辑?由于我使用的是 Windows 10,因此大多数表单对我来说都具有相同的边框样式,但在以前的 Windows 版本中,我无法确定这是我想要的...
    • ShowDialog 方法只是确保在显示表单时代码暂停。我认为它根本不会改变边框样式。
    • 也适用于未来可能需要此类解决方案的人...如果您的表单按钮出现时没有样式,您可以在表单构造函数中键入Application.EnableVisualStyles(); 来修复它。
    【解决方案2】:

    像这样?

        [STAThread]
        static void Main(string[] args)
        {
            if (args[0] == "startFromWinForms")
            {
                using (var game = new Game1())
                    game.Run();
            }
        }
    

    如果你有一个参数,你将开始你的游戏,否则什么都不会发生

    【讨论】:

    • 这是一个简单而聪明的解决方案,我会测试一下。
    猜你喜欢
    • 2011-12-13
    • 2017-08-06
    • 2016-01-13
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2013-02-05
    • 2017-07-09
    相关资源
    最近更新 更多