一種の哲学的な質問だと思います。
私たちはビデオ ゲーム プロジェクトを開始しており、C# を発見していきます。最初に必要なことの 1 つは、定数を一連の配列に格納する方法です。これにより、誰でも簡単にそれらの値にアクセスでき、新しいキャラクターや武器の種類が定義されたときに値をすばやく追加または変更できます。
今C++で、これが私がそれを行うことを学んだ方法です:
- いくつかの constants.h ファイルで列挙型を宣言し、その最後の要素は "WHATEVER_TYPE_END" です。
- 列挙型と配列インデックスは C++ で適切に機能するため、サイズ "WHATEVER_TYPE_END" の定数配列を宣言します。
- これらの配列に、constants.cpp のさまざまな型のさまざまな値を入力します。
例:
enum FoulType {
FOUL_TYPE_NONE,
FOUL_TYPE_OUT_OF_PLAY,
FOUL_TYPE_OFFSIDE,
FOUL_TYPE_VIOLENCE,
FOUL_TYPE_RETENTION,
FOUL_TYPE_END
};
extern const char* FoulTypeNames[FOUL_TYPE_END];
extern const float FoulSanctionChances[FOUL_TYPE_END];
extern const ushort FoulSanctionSeconds[FOUL_TYPE_END];
extern const uchar FoulSanctions[FOUL_TYPE_END];
プログラマーが修飾子を非常に簡単に取得できるため、これは優れています。私のキャラクターがどれだけのダメージを与えるかを計算したい場合は、次のようにします
CharacterType charType = myCharacter.getType();
WeaponType weapType = myCharacter.getWeapon().getType();
damage = CharacterDamages[ charType ] * WeaponModifiers[ weapType ];
現在 C# で、同様の結果を得る方法を頭に入れようとしています。3 時間の試行錯誤の後、ようやく機能するものを手に入れましたが、ややハッキーに見えます。
私が持っているのは、パブリック列挙型が宣言され、サイズ (int)SomeEnum.END のパブリック静的読み取り専用配列が定義されている静的クラス (Constants という名前) です。宣言は次のようになります。
public enum WeaponType
{
Gun = 0,
Shotgun,
Assault,
End
};
public static readonly int[] WeapDamage = new int[ (int)WeaponType.End]
{
10,
50,
10
};
CS0134のため、配列は読み取り専用で const ではありません。enum は int に明示的にキャストする必要がありますが、それ以外の場合は正常に機能します。さて、これらの「定数」は実際には定数ではないことがわかっています。これらの配列の値は変更される可能性があります。この問題に対する 2 つの可能な解決策を見つけました。
- 配列を保護し、ゲッターを使用して、誰かが 1 つの値だけでなく全体が本当に必要な場合は、配列のコピーを返します。
- ReadOnlyCollection の使用
私は古い C++ の方法 (それ自体は私が想像するほどきれいではないかもしれません) に偏っているので、これらの解決策のどれも私には魅力的ではありません (特に ReadOnlyCollection ではありません。 ) 時間やメモリのオーバーヘッドを恐れています (リアルタイムのマルチプレイヤー ゲームを扱っています)。
ほとんどの場合、私が別の言語で知っていることとほとんど同じであるが完全ではないものを実装するためだけに費やした努力の量は、私が物事を正しく行っていないという兆候にすぎないと思います。では、私よりも C# やビデオ ゲームの作成経験が豊富な人にとって、ここに多数の定数を格納する適切な方法は何でしょうか?