在XNA中显示不同的屏幕?

时间:2013-07-11 01:39:06

标签: c# xna

最近开始使用XNA(来自java)并遇到显示游戏屏幕的问题。在加载XNA时,我得到了一个game.cs类,我将其解释为一组用于在游戏中绘制单个自包含屏幕的函数。显然,将所有不同屏幕的代码输入到这个单独的类中会很快变得非常混乱,所以我创建了下面的类来处理更改:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Colonies
{
    public class GameManager //manages game screens
    {
        Microsoft.Xna.Framework.Game currentScreen;

        public enum screens { menu, game, summary };

        public GameManager()
        {
            initialize();
        }

        public void initialize()
        {
            currentScreen = new Menu(this);
            ((Menu)currentScreen).Run();
        }

        public void changeScreen(int i) 
        {
            switch (i)
            {
                case 0:
                    currentScreen = new Menu(this);
                    ((Menu)currentScreen).Run();
                    break;
                case 1:
                    currentScreen = new World(this);
                    ((World)currentScreen).Run();
                    break;
                case 2:
                    currentScreen = new Summary(this);
                    ((Summary)currentScreen).Run();
                    break;
            }
        }
}

}

然而,当其中一个更改被触发时,这会导致错误标记,告诉我我不能多次调用游戏。这是否意味着初步估计有一个单一的通用游戏屏幕实际上是正确的吗?!应该是经理而不是像屏幕一样查询游戏,然后在主游戏.ccs类中调用哪些方法?

在game.cs更新方法中,例如:

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    // TODO: Add your update logic here
    aGameManager.getAGameObject.DoAnUpdate();
    base.Update(gameTime);
}

所以基本上我的主要游戏类永远不会再次运行,只是改变它显示的内容。这是正确的解决方案吗? (隐藏了很多游戏类,我不确定使用它的正确方法是什么)

2 个答案:

答案 0 :(得分:1)

Game课程整个游戏。这就是为什么它被称为Game。如果需要,您可以创建“屏幕”对象,每个对象控制不同的屏幕,并在尝试使用“游戏管理器”时使用Game类。

EG:

public static int currentScreen = 0; // Any screen can change this variable when needed


List<Screenobject> myscreens = new List<Screenobject>(); // Populate this with screens
// OR
menuscreen = new menuScreen();
otherscreen = new otherScreen();
// ...


protected override void Update(GameTime gameTime)
{
      myscreens[currentScreen].Update(gameTime);
      // OR
      switch (currentScreen)
      {
          case 1:
               menuscreen.Update(gameTime); break;
          // ...
      }
      base.Update(gameTime);
}

Draw(..)Update(..)

相同

答案 1 :(得分:-1)

创建枚举器

enum gamestate
   mainmenu
   gameplay
   options
end enum

然后只需更新(绘制)主要功能

if gamestate = mainmenu then mainmenu.update();
if gamestate = gameplay then gameplay.update()