Игра XNA - откройте всплывающее окно или экран пользовательской игры перед запуском игры - PullRequest
0 голосов
/ 30 ноября 2011

Можно ли открыть пользовательский экран или всплывающее окно (модальное) в игре XNA. Идея состоит в том, чтобы показать пользователю несколько вариантов игры и других приложений, которые станут частью набора приложений.

public class MyGame : Game
{

    #region Initialization


    /// <summary>
    /// Creates a new instance of the game.
    /// </summary>
    public MyGame()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";            
           ///etc;

    }

    /// <summary>
    /// Performs initializations required by the game.
    /// </summary>
    protected override void Initialize()
    {
        ///I would Like to open a new screen before the actual game
        /// menu is displayed ... also return to this screen after the logic is run
        /// in that screen

        base.Initialize();
    }
}

Любые идеи / предложения / образцы. Спасибо в Adv.

КРЗ.


Спасибо, Blau. Я попробовал решение DrawableGameComponent (скопировал код из статьи), но тщетно. Независимо от того, что я делаю, отображается только пустой экран.

В конструкторе игр я ставлю условие и вызываю метод как

if (showScreen)
    {
      LaunchScreen launcher = new LaunchScreen(this, null);
      //Components.Add(launcher); 
      launcher.Show();
    }
else{///constructor code}

Я также поместил условие в Game Initialize, чтобы, если showScreen был flase, то выполнялся. (Не уверен, что это правильный способ сделать)

Класс выглядит так:

public class LaunchScreen : DrawableGameComponent
{
    private Texture2D backgroundImage = null;
    private SpriteBatch spriteBatch = null;

    public LaunchScreen(Game game, Texture2D texture)
        : base(game)
    {
        backgroundImage = texture;
        Visible = false;
        Enabled = false;


    }

    public virtual void Show()
    {
        Visible = true;
        Enabled = true;

    }

    public virtual void Hide()
    {
        Visible = false;
        Enabled = false;
    }

    public override void Initialize()
    {

        base.Initialize();
    }

    public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime)
    {
        //if (backgroundImage != null)
        //{
        spriteBatch = new SpriteBatch(base.GraphicsDevice);
        if (Game.Services.GetService(typeof(SpriteBatch)) == null)
            Game.Services.AddService(typeof(SpriteBatch), spriteBatch);

        Rectangle screen = new Rectangle(0, 0,
                Game.Window.ClientBounds.Width,
                Game.Window.ClientBounds.Height);
        Texture2D lauT2D = this.Game.Content.Load<Texture2D>("Textures/BG");
        spriteBatch.Draw(lauT2D, screen, Color.White);

        //}
        ///SpriteFont font = this.Game.Content.Load<SpriteFont>("Fonts/MenuFont");
        ///Vector2 spritePosition = Vector2.One;
        ///spriteBatch.DrawString(font, "Goodness ME", spritePosition, Color.White);

        base.Draw(gameTime);
    }
}

Я полностью запутался в том, как инициализировать GraphicDevice и SpriteBatch и открыть окно перед тем, как будет запущена / инициализирована настоящая игра. КРЗ

1 Ответ

2 голосов
/ 30 ноября 2011

Это стопка экранов, верхний экран обновляется / отображается

Вы можете реализовать экраны для вашего меню, конфигурации, учебника, сольной игры, многопользовательской игры, меню паузы ....etc.

public class ScreenManager : DrawableGameComponent
{
     Stack<Screen> Screens = new Stack<Screen>();

     public event Action<Screen> PopDone;
     public event Action<Screen> PushDone;

     public override void Update(gametime)
     {
         if (Screens.Count>0) Screens.Peek().Update(gametime);   
     }

     public override void Draw(gametime)
     {
         if (Screens.Count>0) Screens.Peek().Draw(gametime);   
     }

     public void Push(Screen screen)
     {
         Stack.Push(screen);
         if (PushDone!=null) PushDone(screen);
     }

     public void Pop()
     {
         Screen screen = Stack.Pop();
         if (PopDone!=null) PopDone(screen);
     }
}

public abstract class Screen : DrawableGameComponent()
{
     protected ScreenManager Manager;
     public Screen(ScreenManager manager) {
        this.Manager = manager;
     }
    // Your template code for screens
}

public class MenuScreen : Screen
{
    public void Update()
    {
       if (ChooseConfig())
       {
            Manager.Push(new ConfigScreen());
       }
    }
}

public class ConfigScreen : Screen
{
    public void Update()
    {
       if (ChooseReturn())
       {
            Manager.Pop();
       }
    }
}

public Game1: Game {

    ScreenManager Manager;

    public override Initialize()
    {
         Manager = new ScreenManager(this);      
         Manager.PopDone += ScreenPopDone;
         Manager.Push( new MenuScreen() );
    }

    void ScreenPopDone(Screen sender)
    {       
        if (sender is MenuScreen)
        {
             Exit();  
        }
    }

}
...