メインのゲーム クラスがあり、ゲーム ステートの列挙型を作成しました。この列挙型を他のクラスからアクセスできるようにするにはどうすればよいですか? 公開する必要があることは知っていますが、他のクラスからアクセスできるようにすることはできません。私がやろうとしているのは、列挙型を介して現在のゲームの状態を確認し、現在のゲームの状態に応じてさまざまなことを実行できるように、さまざまなクラスを用意することです。
3 に答える
これには主に 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;
}
}
}
ただし、ゲームの状態をゲーム以外のオブジェクトに公開することは、可能な限り避ける必要があります。ゲームのカプセル化を破り、オブジェクトを密結合します。オブジェクトは本当にゲームの状態を知る必要がありますか、それとも操作するために知っておく必要があるより具体的なことはありますか? ゲーム クラスによって制御される各ゲーム ステートに対応する 2 つの個別のオブジェクトを作成できますか?
public class GameClass
{
public static GameState State;
}
これは、作成する GameClass インスタンスの数に関係なく State のインスタンスが 1 つしかないことを意味しますが、この場合は望ましい動作のようです。gameClassInstance.State の代わりに GameClass.State でアクセスできます
どの名前空間にあるかによって、アクセスしたい .cs ファイルの先頭に次の行 (または同様の行) を配置する必要がある場合があります。
using MyGame.ThisIsMyNameSpace;
これにより、列挙型が公開されるため、完全に修飾しなくても参照できます
または、現在のゲームの状態にアクセスする方法が必要な場合は、何かへの参照が必要です。多くの人が行うことの 1 つは、Game
クラスにパブリック プロパティを作成し、そのインスタンスへの参照を渡すことです。他の人は、シングルトンまたは静的クラスを作成して、そのグローバルに利用可能なスペースを保持します。それはすべて、コード スタイルとゲームのサイズに依存します。