| Как реализовать инвентарь героя? | 
|  | 
| 
| Nedname | Дата: Четверг, 15 Января 2015, 21:07 | Сообщение # 1 |  | был не раз Сейчас нет на сайте | Всем доброго вечера! Недавно начал изучать C# и решил сделать небольшую консольную RPG-игру, назвал - Diablo, что собственно не удивительно) Но вот появился вопрос, как сделать инвентарь персонажа? То есть купил оружие, например Разделочный Нож Мясника и к урону героя прибавляется урон оружия, но при этом оружие должно иметь свои свойства (уровень, урон, камни в слотах, бонусы) с возможностью улучшения. Для этого можно сделать класс для каждого оружия. Но как узнать какое оружие купил герой? 
 
 Сообщение отредактировал Nedname - Четверг, 15 Января 2015, 21:07 |  |  |  |  | 
| 
| Marsha | Дата: Четверг, 15 Января 2015, 21:21 | Сообщение # 2 |  |   почетный гость Сейчас нет на сайте | Цитата Nedname (  ) Но как узнать какое оружие купил герой?Сохранить в переменную? Сделать массив моё_оружие (если можно покупать и одновременно хранить несколько видов), заполнять его по мере необходимости. А когда герой берёт оружие - заполнять переменную выбранное_оружие. Если оружие такое-то, то урон такой-то, бонусы такие-то. Или неправильно понимаю суть вопроса?
 
 
   Не падай духом где попало...
 |  |  |  |  | 
| 
| _ToBe_ | Дата: Четверг, 15 Января 2015, 21:23 | Сообщение # 3 |  | постоянный участник Сейчас нет на сайте | На сколько я знаю, в такого рода РПГ у каждого итема есть свой ID... Думаю и тебе надо каждому типу оружия генерировать свой уникальный ID и дальше плясать от него |  |  |  |  | 
| 
| Nedname | Дата: Четверг, 15 Января 2015, 21:46 | Сообщение # 4 |  | был не раз Сейчас нет на сайте | В принципе все правильно, но так разумно делать только если количество оружия очень мало. Ну а если оружия и других предметов много 20+ например? Придется делать очень большой switch. Сейчас приведу небольшой пример: 
 
 
 Обновление : _ToBe_ смотри спойлер, но за идею с ID спасибо)
 
 
 Сообщение отредактировал Nedname - Четверг, 15 Января 2015, 21:50 |  |  |  |  | 
| 
| _ToBe_ | Дата: Четверг, 15 Января 2015, 22:02 | Сообщение # 5 |  | постоянный участник Сейчас нет на сайте | Nedname, 20+ предметов не беда Вот список ID из Ла2
 Ну и в конце-концов, все характеристики можно скинуть на ID...
 Например:
 ID = 785
 -- Type: Sword
 -- P.Atack: +157
 -- Atck. Speed: +80
 -- Weight: +90
 -- Speed: -10
 
 И получаем "МечВойна: +157 атаки, +80 скорость атаки, -10 скорость передвижения"
 |  |  |  |  | 
| 
| Nedname | Дата: Четверг, 15 Января 2015, 22:14 | Сообщение # 6 |  | был не раз Сейчас нет на сайте | К идее с ID претензий нет, но я хотел узнать можно ли как-то сократить, допустим это: 
 class BigAxe {
 
 ID = 0001;
 type = "Axe";
 atack = 100;
 weight = 100;
 speedBonus = -10;
 
 class Hero {
 
 weaponType = BigAxe.type;
 damage += BigAxe.atack;
 speed += BigAxe.atack;
 }
 
 А если таких BigAxe'ов очень много? Код растянется на сотни строк. Нельзя ли сделать это как-то по-другому?
 |  |  |  |  | 
| 
| _ToBe_ | Дата: Четверг, 15 Января 2015, 22:24 | Сообщение # 7 |  | постоянный участник Сейчас нет на сайте | ну можно массивом задать 
 Item[10] = [001, 'Axe', 100, 100, -10]
 где
 Item[10] = [НомерID, Type, Attack, weight, SpeedBonus]
 
 и дальше Герою придавать статы из массива предмета... не знаю как синтаксис в С#, но примерно так будет выглядеть
 HeroAttack += Item[2] - где цифра 2 указывает на параметр Attack из массива
 |  |  |  |  | 
| 
| OpenGOO | Дата: Четверг, 15 Января 2015, 22:50 | Сообщение # 8 |  |   почти ветеран Сейчас нет на сайте | Nedname, так данные об оружии должны храниться во внешнем файле. 
 Мои проекты:
 - Свободный и открытый клон World Of Goo
 - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
 
 [GameMaker: Studio v1.4.9999]
 |  |  |  |  | 
| 
| Snake174 | Дата: Пятница, 16 Января 2015, 08:06 | Сообщение # 9 |  |   участник Сейчас нет на сайте | Цитата А если таких BigAxe'ов очень много? Код растянется на сотни строк. Нельзя ли сделать это как-то по-другому?Можешь попробовать все оружия унаследовать от какого-нибудь класса, например Weapon
 
 Код  class Weapon
 {
 protected int ID;
 protected string type;
 protected int atack;
 protected int weight;
 protected int speedBonus;
 }
 
Дальше создаёшь класс оружия, унаследованный от данного класса:
 
 Код  class BigAxe : public Weapon
 {
 ID = 0001;
 type = "Axe";
 atack = 100;
 weight = 100;
 speedBonus = -10;
 }
 
У класса Hero делаешь функцию переключения на определённое оружие:
 
 Код  class Hero
 {
 function switch( Weapon w )
 {
 weaponType = w.type;
 damage += w.atack;
 speed += w.atack;
 }
 }
 
И уже где-нибудь в коде используешь это:
 
 Код  BigAxe bigAxe = new BigAxe();
 hero.switch( bigAxe );
 
Думаю принцип понятен.
 
 Только если так делать
 
 Цитата  damage += w.atack;
 speed += w.atack;
 
, то при каждом переключении на оружие damage и speed будут увеличиваться.
 
 Не следует обманывать инспектора
 Pipmak Assistant
 Love2D Exporter
 Love2D-Helpers
 
  Old Consoles Games 
 
 Сообщение отредактировал Snake174 - Пятница, 16 Января 2015, 08:11 |  |  |  |  | 
| 
| OpenGOO | Дата: Пятница, 16 Января 2015, 09:48 | Сообщение # 10 |  |   почти ветеран Сейчас нет на сайте | Цитата Snake174 (  ) Код 
 BigAxe bigAxe = new BigAxe();
 hero.switch( bigAxe );
Лучше фабрикой воспользоваться
 
 
 Код ItemFactory factory = new ItemFactory(); ...
 Weapon wpn = factory.createWeapon("BigAxe");
 hero.switch( wpn );
 Мои проекты:
 - Свободный и открытый клон World Of Goo
 - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
 
 [GameMaker: Studio v1.4.9999]
 |  |  |  |  | 
| 
| FadeBaker | Дата: Пятница, 16 Января 2015, 10:19 | Сообщение # 11 |  | JavaSE Game Developer Сейчас нет на сайте | У тебя должны быть классы, описывающие предметы инвентаря, и сам список с этими предметами — инвентарь игрока. Значит, смотри, примерно так: 
 Код public class Item { protected static int ids;
 
 // здесь инициализация всех игровых предметов
 public static readonly Item otherItem = new Item("Other item", Sprites.item);
 public static readonly WeaponItem axe = new WeaponItem("Axe", Sprites.axe, 24, 50, 1.2f);
 public static readonly WeaponItem sword = new WeaponItem("Sword", Sprites.sword, 16, 32, 1.6f);
 
 public readonly int id;
 public string name;
 public Sprite sprite;
 
 public Item(string name, Sprite sprite) {
 this.name = name;
 this.sprite = sprite;
 id = ids++; // автоматическое присвоение ID
 }
 }
 Код public class WeaponItem : public Item { public int damage;
 public int weight;
 public float speedBonus;
 
 public WeaponItem(string name, Sprite sprite, int damage, int weight, float speedBonus) {
 base(name, sprite);
 this.damage = damage;
 this.weight = weight;
 this.speedBonus = speedBonus;
 }
 }
Список с предметами и добавление предмета инвентарь:
 
 Код List<Item> items = new List<>(); // инвентарь игрока items.add(Item.axe); // добавляем, например, топор
 
Применение характеристик:
 
 Код Item selectedItem; // переменная, хранящая выбранный предмет if (selectedItem is WeaponItem) { // если выбранный предмет является оружием
 WeaponItem wi = (WeaponItem) selectedItem; // приводим к типу и прибавляем хар-ки
 player.damage += wi.damage;
 player.speedBonus += wi.speedBonus;
 // и т.д.
 }
 Уроки по GM
 Minecraft 2D на GM
 — Мои проекты —
 Blood Harvest [2D] — Original
 Blood Harvest [2D]: Remastered Edition
 Adventure Craft [2D] — Sandbox
 Space Shock [2D] — Scroll Shooter
 Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
 |  |  |  |  | 
| 
| Nedname | Дата: Понедельник, 19 Января 2015, 16:04 | Сообщение # 12 |  | был не раз Сейчас нет на сайте | Всем спасибо за ответы! Решил сделать, как посоветовал Snake174. |  |  |  |  |