【问题标题】:How to make enum accessible from other classes in XNA when enum is defined in main game class?在主游戏类中定义枚举时,如何使枚举从 XNA 中的其他类访问?
【发布时间】:2011-01-18 18:08:24
【问题描述】:

所以我有我的主要游戏类并为游戏状态创建了一个枚举。 如何使其他类可以访问此枚举?我知道您必须将其公开,但我似乎无法让其他班级可以访问它。 我想要做的是有一堆不同的类能够通过枚举检查当前的游戏状态,并根据当前的游戏状态做不同的事情。

【问题讨论】:

    标签: class enums xna accessible


    【解决方案1】:

    有两种主要方法可以做到这一点。

    1. 通过全局变量或单例使游戏状态可全局访问。
    2. 将游戏状态提供者对象传递给需要了解游戏状态的对象。

    我更喜欢选项 2,因为它使您的依赖关系更加明确。

    public enum GameState
    {
       Running,
       Paused
    }
    
    public interface IGame
    {
       GameState State { get; }
    }
    
    public class SomeObject
    {
       private IGame m_game;
    
       public SomeObject(IGame game)
       {
          m_game = game;
       }
    
       public void Update()
       {
          switch (m_game.State)
          {
             case GameState.Running:
                UpdateRunning();
                break;
    
             case GameState.Paused:
                UpdatePaused();
                break;
          }
       }
    }
    
    public class Game : IGame
    {
       GameState m_state;
       SomeObject m_object;
    
       public Game()
       {
          m_object = new SomeObject(this);
          m_state = GameState.Running;
       }
    
       public GameState State
       {
          get
          {
             return m_state;
          }
       }
    }
    

    但是,如果可能,应避免将游戏状态暴露给游戏以外的对象。它打破了游戏的封装性,并将您的对象紧密耦合在一起。对象真的需要知道你的游戏状态还是它们需要知道更具体的东西才能运行?你能有两个独立的对象,一个对应于由游戏类控制的每个游戏状态吗?

    【讨论】:

    • +1 用于封装,也让你的代表不是野兽的数量
    【解决方案2】:

    根据它所在的命名空间,您可能必须将以下行(或类似的行)放在您想要访问它的任何 .cs 文件的顶部:

    using MyGame.ThisIsMyNameSpace;
    

    这会公开枚举,以便您可以引用它而无需完全限定它

    ,如果您的意思是您需要一种访问当前游戏状态的方法,那么您需要对某些内容进行引用。许多人做的一件事是在Game 类上创建一个公共属性,然后传递对该实例的引用。其他人只是创建一个单例或静态类来保存全局可用空间。这完全取决于您的代码风格和游戏的大小

    【讨论】:

      【解决方案3】:
      public class GameClass
      {
          public static GameState State;
      }
      

      这意味着无论您创建多少 GameClass 实例,都只会有一个 State 实例,但在这种情况下,这似乎是理想的行为。您可以使用 GameClass.State 而不是 gameClassInstance.State 来访问它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        相关资源
        最近更新 更多