Как реализовать инвентарь героя?
|
|
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.
|
|
| |