XNA - ¿Cómo salir del juego de una clase que no sea principal?

¿Cómo se hace para que el juego pueda salir pero no tener el código en la clase principal, tenerlo en una clase diferente?

preguntado el 15 de mayo de 13 a las 04:05

4 Respuestas

También puede usar una especie de patrón singleton, mediante el cual en su clase de juego principal define una variable estática del tipo de esa clase. Cuando construye o inicializa esa clase, luego establece esa variable en this, lo que le permite tener una referencia de fácil acceso a la instancia de la clase en cualquier lugar.

public class Game1 : Microsoft.Xna.Framework.Game
{
    public static Game1 self;

    public Game1()
    {
        self = this;
        //... other setup stuff ...
    }

    //... other code ...
}

Luego, cuando desee llamar a un método en esta clase desde prácticamente cualquier lugar del código, simplemente haría lo siguiente:

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

Esto funciona ya que normalmente solo debería haber un solo Game clase en existencia. Naturalmente, si de alguna manera tuvieras múltiples Game clases, este método no funcionará tan bien.

respondido 17 mar '15, 00:03

Me encanta esta solución :) - rurouniwallace

Puedes crear un método:

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

Supongo que desea salir del juego en un componente del menú, en cuyo caso deberá pasar la instancia del juego 1 al componente, tal vez agregarlo como un parámetro en el método de actualización de componentes del menú.

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

No estoy seguro de si hay otras formas ... Tal vez encontrar una manera de "forzar" el botón de cerrar para presionar.

Para enviar la instancia de 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'
}

Respondido el 17 de enero de 15 a las 00:01

'Microsoft.Xna.Framework.Game' no contiene una definición para 'Quit' y no se pudo encontrar ningún método de extensión 'Quit' que acepte un primer argumento del tipo 'Microsoft.Xna.Framework.Game' (¿falta una directiva de uso o una referencia de montaje?) - loshermanoscuanticos

Creo que todavía estás tratando de usarlo mal. Asegúrate de llamar al juego, la instancia, no al juego, la clase. Quit es un método que inventé que contiene this.Exit(), y this.Exit() es lo que cierra la página. Tenga en cuenta que el método de actualización que se muestra arriba está en la clase que no es juego1, y se pasa un nuevo parámetro al método de actualización (juego de juego) que no estaba allí antes. - Colton

Lo descubrí, está destinado a ser el juego Game1, no el juego Game, pero cuando depuro dice esto; Referencia a objeto no establecida como instancia de un objeto. y destaca game.Quit(); - loshermanoscuanticos

Gracias, usé el juego en lugar de esto en lo que pusiste arriba, por lo que no funcionaba, pero ahora sí. - loshermanoscuanticos

Hmm.... eso realmente no debería haber hecho una diferencia. Al enviar Game1, SOLO puede enviar Game1. No podrás enviar un Game2 más adelante. Ejecuté el código solo con Game game y funcionó bien... - Colton

En tu clase de juego principal (Game1 por defecto) usa una variable global:

public static Boolean exitgame = false;

En la rutina de actualización de Game1:

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

Respondido 19 Oct 13, 20:10

Puede decirle al motor XNA que se cierre inmediatamente así:

Game.Exit();

Esto saldrá inmediatamente del juego. Fíjate que digo Game.Exit() - El juego debe ser tu instancia de juego. Si está codificando dentro de una clase que implementa Game, simplemente puede hacer lo siguiente:

Exit()

contestado el 15 de mayo de 13 a las 04:05

Recibo este error y no sé cómo solucionarlo; "Se requiere una referencia de objeto para el campo, método o propiedad no estáticos 'Microsoft.Xna.Framework.Game.Exit()'" - loshermanoscuanticos

El juego en realidad no es estático, al principio me equivoqué al respecto. Algo en su proyecto debería extender el Juego, o está creando un nuevo Juego. Dondequiera que esté, simplemente use myGame.Exit() (donde myGame es la instancia de Game). - cristiano stewart

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.