【问题标题】:XNA - How to Exit Game from class other than main?XNA - 如何从除主类之外的类中退出游戏?
【发布时间】:2013-05-09 11:52:50
【问题描述】:

你是怎么做到的,所以游戏可以退出,但在主类中没有代码,在不同的类中?

【问题讨论】:

    标签: c# menu xna exit


    【解决方案1】:

    您还可以使用一种单例模式,即在您的主游戏类中定义该类类型的静态变量。当您构造或初始化该类时,然后将该变量设置为this,这样您就可以在任何地方轻松访问该类的实例。

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        public static Game1 self;
    
        public Game1()
        {
            self = this;
            //... other setup stuff ...
        }
    
        //... other code ...
    }
    

    然后,当您想从代码中的几乎任何位置调用此类中的方法时,您只需这样做:

    Game1.self.Exit(); //Replace Exit with any method
    

    这是可行的,因为通常应该只存在一个 Game 类。当然,如果您以某种方式拥有多个 Game 类,则此方法将无法正常工作。

    【讨论】:

    • 我喜欢这个解决方案 :)
    【解决方案2】:

    你可以创建一个方法:

    //Inside of game1.cs
    public void Quit()
    {
        this.Exit()
    }
    

    我假设您想在菜单组件上退出游戏,在这种情况下,您需要将 game1 的实例传递给组件,或者将其作为参数添加到菜单组件更新方法中。

    public void Update(GameTime gameTime, Game1 game)
    {
         if(key is pressed)
         {
              game.Quit();
         }
    }
    

    我不确定是否还有其他方法...也许找到一种方法来“强制”按下关闭按钮。

    为了发送game1.cs的实例:

    //in game1.cs
    //in your update method
    public void Update(GameTime gameTime)
    {
         //sends the current game instance to the other classes update method, where
         // quit might be called.
         otherClass.Update(gameTime, this);
         //where 'this' is the actual keyword 'this'. It should be left as 'this'
    }
    

    【讨论】:

    • 'Microsoft.Xna.Framework.Game' 不包含 'Quit' 的定义,并且没有扩展方法 'Quit' 接受类型为 'Microsoft.Xna.Framework.Game' 的第一个参数找到(您是否缺少 using 指令或程序集引用?)
    • 我认为您仍然在尝试错误地使用它。确保你调用的是游戏,实例,而不是游戏,类。 Quit 是我编写的包含 this.Exit() 的方法,而 this.Exit() 是关闭页面的方法。请注意,上面显示的更新方法在非game1类中,并且正在将一个新参数传递给以前不存在的更新方法(游戏游戏)。
    • 我想通了,它应该是Game1游戏而不是Game游戏,但是当我调试时它会这样说;你调用的对象是空的。并突出显示 game.Quit();
    • 谢谢,我在你上面放的东西上用了游戏而不是这个,所以它不起作用,但现在它起作用了。
    • 嗯....这确实不应该有所作为。通过发送 Game1,您只能发送 Game1。稍后您将无法发送 Game2。我只用游戏游戏运行代码,它运行良好......
    【解决方案3】:

    在您的主游戏类中(默认为Game1)使用全局变量:

    public static Boolean exitgame = false;
    

    在 Game1 更新例程中:

    protected override void Update(GameTime gameTime)
    {    
         SomeOtherClass.Update(gameTime);
         if (exitgame) this.Exit();
         base.Update(gameTime);
    }
    

    【讨论】:

      【解决方案4】:

      您可以像这样告诉 XNA 引擎立即关闭:

      Game.Exit();
      

      这将立即退出游戏。请注意,我说Game.Exit() - Game 应该是您的游戏实例。如果您在实现Game 的类中进行编码,您可以简单地执行以下操作:

      Exit()

      【讨论】:

      • 我收到了这个错误,我不知道如何解决它; "非静态字段、方法或属性 'Microsoft.Xna.Framework.Game.Exit()' 需要对象引用"
      • 游戏实际上并不是静态的,起初我错了。您项目中的某些内容应该扩展 Game,或者您正在创建一个新游戏。无论在哪里,只需使用 myGame.Exit() (其中 myGame 是 Game 的实例)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多