Как сделать enum доступным из других классов в XNA, когда enum определен в основном игровом классе? - PullRequest
1 голос
/ 18 января 2011

Итак, у меня есть основной класс игры, и я создал перечисление для состояния игры. Как сделать это перечисление доступным для других классов? Я знаю, что вы должны сделать это публичным, но я не могу сделать его доступным для других классов. То, что я пытаюсь сделать - это иметь несколько разных классов, чтобы иметь возможность проверять текущее состояние игры с помощью enum и делать разные вещи в зависимости от текущего состояния игры.

Ответы [ 3 ]

3 голосов
/ 19 января 2011

Есть два основных способа сделать это.

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

Однако, если возможно, следует избегать воздействия на состояние игры какого-либо объекта, кроме игры. Это нарушает инкапсуляцию вашей игры и тесно связывает ваши объекты вместе. Действительно ли объекты должны знать ваше игровое состояние или есть более конкретная вещь, которую они должны знать, чтобы работать? Можете ли вы иметь два отдельных объекта, по одному для каждого игрового состояния, которые контролируются игровым классом?

0 голосов
/ 21 февраля 2011
public class GameClass
{
    public static GameState State;
}

Это означает, что будет только один экземпляр State независимо от того, сколько экземпляров GameClass вы создаете, но в этом случае кажется, что это будет желаемое поведение.Вы можете получить к нему доступ с GameClass.State вместо gameClassInstance.State

0 голосов
/ 18 января 2011

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

using MyGame.ThisIsMyNameSpace;

Это выставляет enum, так что вы можете ссылаться на него без необходимости полностью его квалифицировать

или , если вы имеете в виду, что вам нужен способ доступа к текущему состоянию игры, то вам нужно иметь ссылку на что-то. Многие люди делают публичное свойство класса Game и передают ссылку на этот экземпляр. Другие люди просто создают одноэлементный или статический класс для хранения этого глобально доступного пространства. Все зависит от вашего стиля кода и размера вашей игры

...