2

一種の哲学的な質問だと思います。

私たちはビデオ ゲーム プロジェクトを開始しており、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# やビデオ ゲームの作成経験が豊富な人にとって、ここに多数の定数を格納する適切な方法は何でしょうか?

4

2 に答える 2

3

本当に定数である必要がありますか?つまり、クラスにラップできます。私は、他の定数に依存するような多くの定数を使用することはあまり好きではありません。あなたのコードはあまりOOまたは可読ではありません。もちろん、メモリ使用量などが懸念される場合は例外があります。

しかし、このようなことを行う C# の方法は、OO を行うことになります。

public class Weapon {
  public string Name { get; private set; }
  public WeaponType Type { get; private set; }
}

public class WeaponType {
  public string Name { get; private set; }
  public int Damage { get; private set; }
}

次に、ゲームの開始時に武器/キャラクターなどを初期化するファクトリ メソッドを用意します。実際のデータは、ファイルのようにどこにでも保存できます。

于 2013-03-13T23:30:28.403 に答える
1

DB、テキストファイル、スプレッドシートなど、起動時に読み込まれる、気になるものは何でも、ある種の「データストア」をお勧めします。これにより、再コンパイルすることなく、DBやテキストファイルなどの行を編集するのと同じくらい簡単にさまざまなパラメータの組み合わせをテストできます。ゲームが安定したら、これらをリソースとしてEXEに保存します。

于 2013-03-13T23:09:43.743 に答える