Как создать словарь навыка /монстра /предмета и т. Д. Для игры?

Я пытаюсь создать пошаговую RPG, где члены группы и враги могут использовать навыки и использовать предметы. Как я мог реализовать модульный список навыков /предметов /монстров (и, возможно, классов персонажей, если я туда доберусь), чтобы каждый участник PartyMember или Enemy мог выбрать умение /элемент из списка и бросить его?

Моя первая попытка:

public static Dictionary<int, Skill> SkillDictionary = new Dictionary<int, Skill>
{
    {1, new Skill1()},
    {2, new Skill2()},
    {3, new Skill3()},
};
public abstract class Skill
{
    int skillIndex;
    public abstract void CastSkill();
}
public class Skill1 : Skill
{
    public Skill1(){skillIndex = 1;}
    public override void CastSkill(){};
}
public class Skill2 : Skill
{
    public Skill2(){skillIndex = 2;}
    public override void CastSkill(){};
}
public class Skill3 : Skill
{
    public Skill3(){skillIndex = 3;}
    public override void CastSkill(){};
}

Поскольку мой код в настоящее время стоит, каждое умение создается только один раз, до Main (из-за статического словаря). Есть ли способ сделать ленивую загрузку, поэтому мне не нужно будет создавать навыки до тех пор, пока не назовут? Является ли ленивая загрузка благоприятной для того, что у меня есть до сих пор? (в случае, если я дойду до точки, где у меня много предметов, монстров и т. д.). Кроме того, предположим, что я должен был сделать MonsterDictionary. Тогда было бы разумно вызвать метод Clone, чтобы создать новый экземпляр монстра? Возможно:

public Monster
{
   string name; 
   int otherStats;
   public Monster(Monster clone)
   {
      this.name = clone.name;
      this.otherStats = clone.otherStats;
   }
}

И чтобы создать новый экземпляр монстра в битве, например:

Enemy e = new Monster(MonsterDictionary["Slime"]);

Или - золотой вопрос - есть ли лучший дизайн? Будет ли Enum адекватным вместо словаря в некоторых из этих случаев? Я относительно новичок в разработке C # и разработке игр, поэтому мне хотелось бы получить некоторую обратную связь, если это возможно. Мне любопытно посмотреть, как другие организовали свои игровые данные.

4 голоса | спросил reincarnationofstackexchange 17 J000000Monday17 2017, 20:30:04

1 ответ


1

Во-первых, я бы предложил сделать подход, основанный на данных, для ваших навыков вместо отдельных классов. Это сделает вашу игру намного более последовательной и управляемой в долгосрочной перспективе. Вы также получаете бонус, чтобы легко вытащить свои данные о навыках из кода в легко изменяемый формат, такой как JSON или YAML.

Одна статья, которая действительно демонстрирует эту концепцию, - это пользовательский способ для Dota2 .

Один из способов решения вашей проблемы заключается в создании двух классов, которые содержат общие данные (имя атаки, тип атаки, диапазон, базовый урон и т. д.) и тот, который содержит конкретное состояние экземпляра (использует этот ход, оставшееся время перезарядки и т. д.), а также ссылку на поиск общего объекта данных в словаре.

Поэтому, когда я хочу добавить навык в единицу, мне просто нужно создать новый экземпляр класса, который будет содержать ссылку на словарь, содержащий данные об умении.

Для вашего примера монстров можно использовать ту же концепцию.

ответил Razzek 22 J000000Saturday17 2017, 00:29:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132