Як я можу визначити елементи в моєму RPG, як гра Java?


21

Я випадково працюю над грою типу RPG на Яві, але у мене виникають проблеми з розумінням того, як у мене можуть бути предмети, які можуть робити багато різних речей, не створюючи різного класу для кожного предмета.

Як приклад, як би я створив Сокиру, яка могла би рубати дерева та атакувати монстрів?

Якщо я продовжую або рубати, або клас зброї, я не можу розширити інший клас.

Якщо у мене рубати, а зброя бути інтерфейсом, у мене буде багато дублюваного коду, коли кинджал також може атакувати монстрів, а інша сокира може різати дерева.

Я сподіваюся, що існує спосіб мати єдиний клас Item і завантажити елементи та їхні вміння з файлу. Якщо це можливо, як це зробити? Якщо це не так, то який найкращий спосіб мати предмети в грі?

Відповіді:


15

Відповідь Грегорі Вейра - моя улюблена те, як структурувати екземпляри предмета, щоб виконати кілька ролей.

Щоб завантажити з файлу:

По-перше, використовуйте YAML. YAML - це функціональна мова опису даних; його можна порівняно швидко проаналізувати, прочитати та відредагувати людиною, підтримує бінарні дані, а бібліотеки існують для більшості мов програмування, включаючи Java. Це вирішує питання "як мені отримати дані з файлів в об'єкти?"

По-друге, використовуйте візерунок з легкої ваги . Більшість даних, які ви читаєте з цих файлів, є статичними. Це не зміниться на примірник ("сокира наносить шкоду 1d10 і руйнує деревину, але не камінь" - це справедливо для всіх п'яти осей, які має гравець). Що ви насправді читаєте з файлів YAML - це платонічне визначення, а ваші окремі екземпляри предметів мають невідомі (і постійні) посилання на них, а також дані про екземпляр, наприклад "Скільки гойдалок, перш ніж я зламаю?", "Чи дав гравець мені власну назву? »тощо.

Спільний доступ до даних між-примірників в одному об’єкті ви зберігаєте багато пам’яті та полегшуєте оновлення елементів без збереженого стану гри (збереження ігор або бази даних гравців).

Тож структура вашого класу виглядає приблизно так:

  • Class Item - Один екземпляр на предмет
    • Володіє екземпляром зброї
    • Володіє екземпляром інструмента
    • Has-власна назва тощо
  • Зброя класу - (до) одного примірника на предмет
    • Is-a ItemComponent
    • Посилається на WeaponDef
    • Has-bonus рівень зачарування тощо.
  • Інструмент класу - (до) одного примірника на предмет
    • Is-a ItemComponent
    • Посилається на ToolDef
    • Має-довговічність і т.д.
  • клас WeaponDef - один екземпляр на вид зброї
    • Читання з файлу, поля повинні бути постійними.
    • Сума-основна шкода, 1 або 2 руки тощо.
  • клас ToolDef - один екземпляр на вид інструменту
    • Читання з файлу, поля повинні бути постійними.
    • Має-довговічність основи, матеріали, які вона може зламати і т.д.

18

Компонентний (не складений) шаблон дизайну чудово підходить для цієї мети: http://gameprogrammingpatterns.com/component.html

В основному, Ax буде екземпляром класу Item, який містив WeaponComponent та ToolComponent (можливо). Щоб перевірити, чи можна щось використовувати як зброю, перевірте, чи є у нього доданий WeaponComponent, а потім поговоріть із цим екземпляром WeaponComponent, щоб отримати інформацію про зброю предмета.

Завантаження з файлу - звичайно, окрема вправа.


І звичайно, коли у вас є компоненти, ви зможете знову добре використовувати інтерфейси. Ваш тип Ax може реалізувати IChopper та IWeapon, але потім може викрити поведінку компонента для нього, що дозволяє повторно використовувати як тип, так і реалізацію за необхідності та вирізаючи тест на компоненти. Якщо всі осі мають однакові можливості, але різні статистичні дані, то ви золотий. Якщо вам потрібні предмети, щоб мати унікальні здібності, можливо, вам знадобиться реалізувати колекцію ігрових компонентів та підпрограми оновлення запитувати об’єкти, що вони можуть робити, за допомогою яких компонентів є.
CodexArcanum

6
@CodexArcanum: "Ваш тип Ax може реалізувати IChopper та IWeapon, але потім може викрити поведінку компонента для цього" - Який сенс у цьому? Це просто роздуває вашу ієрархію класів. Суть в шаблоні компонентів полягає в тому, що вам не потрібен клас Ax або інтерфейс IChopper або інтерфейс IWeapon, просто конкретні компоненти Chopper і Weapon та елемент вищого рівня.

Зараз я працюю над системою компонентів для моїх ігрових предметів, і в мене є лише одна головна скарга на те, як використовується шаблон. З огляду на компоненти зброї, одягу та витратних матеріалів, теоретично предмет може бути «зіпсований» з точки зору предметів, які не можуть бути як зброєю, так і одягом, або одягом, який також є споживчим. Логічно елемент може бути лише одним "основним компонентом", але обмежуючи компоненти, ви порушуєте потребу в компонентній системі разом. Таким чином, одна з основних вад з інакше дивовижною системою
Krythic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.