Създаване на враг от списък

Така че искам да създам случаен враг от списък с врагове, но не мога да намеря чист начин да създам нов екземпляр на врага от екземпляра на врага в списъка. Това е главно защото имам изцяло врагове от различни типове обекти (подкласове от тип 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 = ????;

Как мога да получа нов екземпляр на врага на списъка? Има ли по-добър начин да направите това?


person Gregorio246    schedule 10.11.2012    source източник
comment
Всичките ви врагове приемат едни и същи аргументи на конструктора? Но не разбирам... Вашият списък вече съдържа екземпляри, а не шаблон или дефиниция. Защо не можете просто да ги използвате директно?   -  person LightStriker    schedule 11.11.2012
comment
Не мога да ги накарам всички да са един и същ екземпляр, защото всички се нуждаят от независими позиции, ъгли и т.н.   -  person Gregorio246    schedule 11.11.2012
comment
И така, защо създавате екземпляри в този списък??   -  person LightStriker    schedule 11.11.2012
comment
Така че имам шаблон за копиране, те са специфични типове врагове.   -  person Gregorio246    schedule 11.11.2012


Отговори (3)


Опитайте да създадете метод „Клониране“ за всеки подтип на врага и извикайте този метод на избрания произволно от списъка. Можете също така да отидете "лека категория"; създайте по-плитко копие, което просто препраща към по-скъпите членове на врага, като графични елементи (спрайтове, текстури, скелет), вместо да правите множество копия в паметта.

person KeithS    schedule 10.11.2012

Променете дефиницията си за враг, за да внедрите интерфейса ICloneable, или използвайте метода Object.MemberwiseClone.

Вижте също Създаване на копие на обект в C# и Как се прави дълбоко копие на обект в .NET (по-специално C#)?

person ChrisW    schedule 10.11.2012
comment
ICloneable не е страхотен интерфейс концептуално (няма информация, присъща на интерфейса, която да ви каже колко дълбоко копие прави внедряването), но функционално казано, това е почти това, което OP иска. Не препоръчах конкретно ICloneable в моя отговор, но OP се нуждае от някакъв метод за дълбоко копиране, независимо дали е реализация на ICloneable или нещо ръчно навито. - person KeithS; 14.11.2012

Трябва, поне концептуално, да правите разлика между класове врагове (мрънкане, грешки, ...) и вражески инстанции. Класът определя първоначалното здраве/животни точки на врага, докато екземплярът представлява действително създаден враг с индивидуални статистики и позиция.

Има два варианта за моделиране на това.

Модел на клас/екземпляр

Създавате два класа: един за класа на врага и един за екземпляр на врага. 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();

Прототипен модел

Има само един клас, 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();
person dtb    schedule 10.11.2012
comment
Проблемът е, че трябва да използвам множество класове, за да променя неща като AI и основно поведение. В момента работи добре с модел на прототип от множество класове (и заменящи методи за клониране за всеки клас) - person Gregorio246; 11.11.2012