2012-04-22 8 views
1

私はXNAを使ってWP7用のゲームに取り組んでいます。ここに私の構造は次のとおりです。WP7 XNAの抽象クラスの子をクローンする方法

public abstract class enemy 
{} 

子要素:

public class genericEnemy : enemy{} 
... 
public class snake : enemy {} 

等... WP7で

、物事の多くは(特にシリアライズして)周りの移動および/または削除されましたそうみたいです。多くの検索にもかかわらず、私は解決策を見つけることができませんでした。私は子要素を複製しようとしています。

例:レベルをロードすると、3つの異なる敵の配列をロードフェーズに渡します。ローディング中に、私はそれらの敵のそれぞれを複製して、それぞれ20人がゲームプレイ中に自分のことをやり遂げるようにする必要があります。

私が見たすべての解決策は、WP7ライブラリには存在しないものを参照しています。

+0

はそれが可能あなたが彼らのパブリックプロパティにアクセスし、ちょうどそれらをコピーするためではないですか?または、クラス定義を編集して.Clone()メソッドを追加できますか? (子要素によってはどういう意味ですか?) – neeKo

答えて

0

いくつかの種類のIDから敵を作成できる敵工場を作成します。

class EnemyFactory 
{ 
Enemy CreateEnemy(int id) 
{ 
    if (id == 0) 
    return new Snake(); 
    return new GenericEnemy(); 
} 

} 


void LoadLevel() 
{ 
// bla bla 
Level level = new Level(); 
int enemyId = LoadFromFile(); 
level.AddEnemy(EnemyFactory.CreateEnemy(enemyId)); 
} 

あなたは厄介なクローニングコードを取り除く、あなたはファクトリクラス内のすべての敵のインスタンス化を制御することができますこの方法:あなたのレベルをロードしている間、あなたが敵を作成する必要がある場合、あなたはその後、工場を呼び出すことができます。

+0

私はこのようにして最初は自分のコードを構造化しましたが、より簡単なルートを望んでいました。研究の後、これは私がやっていることを達成する最も簡単な方法のようです。 – julio9

2

私が知る限りこれを行うための「ライブラリ」の方法はありません。 1つの解決策は次のようになります。

1)その敵のコピーを返すClone()メソッドを敵に宣言します。

abstract class Enemy { 
    public abstract Enemy Clone(); 
} 

2)すべての具象タイプでそれを実装するには、その蛇は新しいヘビなどの例を作成します。

class Snake : Enemy { 
    int speed; 
    public override void Enemy Clone() { 
     var clone = new Snake(); 
     clone.speed = speed; 
     return clone; 
    } 
} 

3)さて、具体的な型のオブジェクトは、自身のクローンを作成する方法を知っています、 Enemiesの配列を持っている場合は、それぞれに対してClone()を呼び出すことができ、適切な具体的な型を適切な方法で作成します。

0

は、コピーコンストラクタを呼び出す抽象メソッドを使用します。

public abstract class Enemy 
{ 
    private readonly int mEnemyData; 

    protected Enemy(Enemy pEnemy) 
    { 
     mEnemyData = pEnemy.mEnemyData; 
    } 

    public abstract Enemy Clone(); 
} 

public sealed class GenericEnemy : Enemy 
{ 
    private readonly double mGenericEnemyData; 

    private GenericEnemy(GenericEnemy pGenericEnemy) 
    : base(pGenericEnemy) 
    { 
     mGenericEnemyData = pGenericEnemy.mGenericEnemyData; 
    } 

    public override Enemy Clone() 
    { 
     return new GenericEnemy(this); 
    } 
} 
関連する問題