2

最近开始使用 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;
            }
        }
}

}

但是,当其中一项更改被触发时,这会导致一个错误标志告诉我我不能多次调用游戏运行。这是否意味着最初估计只有一个通用游戏屏幕实际上是正确的?!是否应该为经理查询类似屏幕的游戏,然后在主 game.cs 类中调用哪些方法?

IE

在 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);
}

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

4

2 回答 2

1

Game类就是整个游戏。这就是它被称为 的原因Game。如果需要,您可以创建“屏幕”对象,每个对象控制一个不同的屏幕,并Game像尝试使用“游戏管理器”一样使用该类。

例如:

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(..)

于 2013-07-11T02:16:42.697 回答
0

创建枚举器

enum gamestate
   mainmenu
   gameplay
   options
end enum

然后只需在您的更新(绘制)主要功能中

if gamestate = mainmenu then mainmenu.update();
if gamestate = gameplay then gameplay.update()
于 2013-07-11T06:47:37.703 回答