Четверг, 21 Ноября 2024, 21:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как реализовать инвентарь героя?
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.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг