1

したがって、敵のリストからランダムな敵を生成したいのですが、リスト内の敵のインスタンスから新しい敵のインスタンスを作成するきれいな方法が見つかりません。これは主に、さまざまなオブジェクト タイプ (タイプ Enemy のサブクラス) の敵が完全に存在するためです。そのため、すべての属性を単純にコピーすることはできません。例えば:

List<Enemy> EnemyDB = new List<Enemy>();
EnemyDB.Add(new Enemy(150,1.8f,"grunt"));
EnemyDB.Add(new EnemyOther(60, 5.8f, "bug"));
Enemy template = EnemyDB.[get random enemy];
Enemy toBeSpawned = ????;

リストの敵の新しいインスタンスを取得するにはどうすればよいですか? これを完全に行うためのより良い方法はありますか?

4

3 に答える 3

3

Enemy サブタイプごとに「Clone」メソッドを作成し、リストからランダムに選択したメソッドでそのメソッドを呼び出してみてください。「フライ級」に行くこともできます。複数のメモリ内コピーを作成する代わりに、グラフィック要素 (スプライト、テクスチャ、スケルトン) など、敵のより高価なメンバーを参照するだけの浅いコピーを作成します。

于 2012-11-10T21:37:51.347 に答える
1

敵の定義を変更してICloneableインターフェイスを実装するか、Object.MemberwiseCloneメソッドを使用します。

C# でオブジェクトのコピーを作成する」および「.NET (具体的には C#) でオブジェクトのディープ コピーを行うにはどうすればよいですか? 」も参照してください。

于 2012-11-10T21:42:39.360 に答える
0

少なくとも概念的には、敵のクラス(うなり声、バグなど) と敵のインスタンスを区別する必要があります。クラスは敵の初期のヘルス/ヒットポイントを定義しますが、インスタンスは個々の統計と位置を持つ実際にスポーンされた敵を表します。

これをモデル化するには、2 つのオプションがあります。

クラス/インスタンス モデル

2 つのクラスを作成します。1 つは敵のクラス用、もう 1 つは敵のインスタンス用です。はインスタンスEnemyClassファクトリーです。Enemy

class EnemyClass
{
    public string Name { get; }
    public int InitialHealth { get; }

    public Enemy Spawn();
}

class Enemy
{
    public EnemyClass Class { get; }
    public int CurrentHealth { get; }
    public Vector2D Position { get; }
}

// define enemy classes
EnemyClass gruntClass = new EnemyClass(...);
EnemyClass bugClass = new EnemyClass(...);

// spawn an enemy
Enemy enemy = gruntClass.Spawn();

プロトタイプモデル

クラスは 1 つだけEnemyです。各敵クラスには、そのクラスの敵インスタンスのプロトタイプがあります。このプロトタイプはゲームには存在しません。敵をスポーンするには、プロトタイプのクローンを作成します。

class Enemy
{
    public string Name { get; }
    public int InitialHealth { get; }
    public int CurrentHealth { get; }
    public Vector2D Position { get; }

    public Enemy Clone();
}

// define enemy prototypes
Enemy gruntPrototype = new Enemy(...);
Enemy bugPrototype = new Enemy(...);

// spawn an enemy
Enemy enemy = gruntPrototype.Clone();
于 2012-11-10T21:48:36.623 に答える