Як я можу реалізувати інтелектуальний сценарій у своїй грі?


18

Я розробляю ігровий движок. Він повинен бути об'єктом / компонентами. Для самої розробки своєї гри я подумав використовувати якусь мову сценаріїв, щоб фактично створити сутності.

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

Чи варто використовувати мову сценаріїв для опису цієї сутності, що стосується компонентів, чи є щось інше, що би працювало краще? Більш загально, як я повинен використовувати сценарій у своїй грі?


Для простого опису сутності ви можете використовувати лише xml або щось подібне, не потрібно писати сценарії. Для сценаріїв я б використовував C #, але тільки якщо ваш двигун знаходиться у .NET ...
Kikaimaru

@Kikaimaru C # Це не сценарій мови. Використання lua було б кращою ідеєю чи іншою мовою, яку можна вбудувати у ваш двигун.
JDSweetBeat

@DJMethaneMan "C # - це не сценарій мови" нічого не означає, абсолютно немає проблем із написанням сценаріїв на C # у грі, написаній на C #, і використання чогось на зразок Roselyn для компіляції ... Але через 4 роки я би використовував json a javascript замість xml та C # :)
Kikaimaru

Відповіді:


17

Моя гра використовує структуру компонентів сутності та використовує скрипти для визначення сутності (це не визначає безпосередньо поведінку, я розповім про це в кінці). Сценарії визначають фактичні компоненти, які будуть використані для створення кожної сутності. Він використовує просту мову сценаріїв, яку я створив. Ось спрощена версія одного з моїх сценаріїв:

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

Багато з цього - це самоопис, але ось деякі основні моменти:

  • Перший розділ описує загальну інформацію для суб'єкта господарювання. Це включає опис та відображувальні назви для різних аспектів організації.
  • У baseAttributesпосиланнях тегів інший файл сценарій , який визначає загальні компоненти , які я не хочу , щоб перевизначити кілька разів. Він містить такі компоненти , як position, liferequirementsі так далі. Якщо тут буде визначено будь-який компонент знову, цей компонент замінить загальний.
  • Кожен [NAME] { }набір визначає новий компонент, який буде доданий до цих об'єктів.
  • Цей опис не лише для однієї сутності , це для всіх створених гоблінів. Ви побачите, що деякі значення мають діапазони (тобто 0.01:0.015), коли створюється новий гоблін, він створюється з компонентом, який має випадкове значення в цьому діапазоні. Тож кожен гоблін матиме дещо різні навички та трохи різну швидкість. Цей параметр визначає, що всі гобліни почнуть із справді хороших навичок розміщення кубів та видобутку, що справді лише для моїх власних цілей тестування. Але, як я впевнений, ви можете здогадатися, змінити значення на те, що я хочу, дуже легко.

Вся ця річ включає створення індивідуального аналізатора, якоїсь структури для визначення визначень сутності (я називаю мій Lexicon!) Та фабрику для прийняття цих визначень і створення нових сутностей. Для мене ця система ще знаходиться на ранній стадії, але виходить дуже, дуже добре. Це досить потужна система для швидкого визначення об'єктів і дозволяє зробити будь-яку сутність, яку ви хочете, використовуючи створені вами компоненти. Якщо вам не зручно створювати власний парсер, я думаю, що XML буде працювати чудово. Я перетворив шахту з рекурсивного синтаксичного аналізатора, який я написав для трохи складеної мови програмування.

Як бачимо, це визначає сутність. Я зазначив, що це не визначає безпосередньо поведінку. Однак можна легко визначити такі речі як ненависні вороги та як агресивно реагувати на вказаних ворогів. Це було б так само просто, як визначити, який компонент ви використовуєте для контролю такої поведінки. Мої сутності також мають інтелектуальний компонент (не показаний), який визначає такі речі, як:

  • Як вони знаходять шлях (простий рух в огляді, простий A *, передбачувальний A * тощо)
  • Наскільки вони агресивні / захисні. Суб'єкти можуть мати домашні зони, які захищатимуться, але, можливо, не будуть агресивними поза цими зонами.
  • Поінформованість про технології (відкривати двері, користуватися гаджетами, уникати пасток тощо)
  • І більше...

Однак ваша визначена, саме ваша система буде керувати даними в цьому компоненті, що, в свою чергу, впливає на поведінку ваших даних.


Дякую, що поділились. Я насправді думаю, що я спробую це зробити у форматі XML. Я багато про це думаю (завдяки AbstractChaos btw), і це повинно відповідати моїм потребам (принаймні, для описів юридичних осіб).
Натан

1
@nathan Я погоджуюся, що ви повинні піти з XML. Причиною моєї публікації було більше, які дані потрібно включити у ваш XML та як ними користуватися. Формат даних може бути будь-яким, що вам подобається. Дані, які ви обираєте включити, і як ви реалізуєте його використання набагато важливіші.
MichaelHouse

@ Byte56 Я знаю, що ця публікація є давньою, але як ти можеш поводитися з стосунками батьків-дітей? Скажіть, у нас є дерево вміння, і вам потрібно 10 балів у майстерності A [0], щоб увімкнути A [1], і 10 балів у тому, щоб увімкнути A [2] і т.д. ParentId? Очевидно, що вони логічно рівноцінні, але я сподівався, що ти маєш деяке уявлення про реальний світ.
Superstringcheese

@Superstringcheese if player.hasPoints(10) then i++ end skillTree[i]буде певним кодом . Я навіть не знаю, наскільки це питання стосується посади, однак.
JDSweetBeat

4

Якщо все, що вам дійсно потрібно, це спосіб визначення компонентів Monster, то XML буде добре працювати як на C #, так і на java.

Ваш XML міг бути

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

Тоді може виглядати ваш клас Mob. (Java)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

Де IPersonality - це інтерфейс.

Потім ви можете завантажити свій xml та проаналізувати кожне значення через завод.

наприклад, Проаналізуйте цінність особистості в PersonalityFactory, який просто:

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

Тоді ви могли б створити подібний моб

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

Ключовим моментом є те, що ваш двигун знає формат XML і має завод для всіх необхідних.

Однією з переваг xml є те, що ви можете визначити власну схему, щоб гарантувати, що формат завжди правильний, дивіться тут .

Сподіваюсь, це допомагає


Насправді мені потрібно знайти спосіб легко створити нову суть за допомогою процесу розробки гри. Чи xml буде досить гнучким? Мені потрібно все-таки додати сценарії для внутрішньої логіки гри.
Натан

Якщо ви читаєте клас Mob як Entity, ви створюєте новий Enitity (Mob), використовуючи XML з різними компонентами (IPersonality, Intelligence [приклад даних для цього мобу]). І, на жаль, я не можу відповісти, чи буде він досить гнучким, оскільки я не знаю, що більше ви хочете, щоб це робилося, крім того, що ви вказали. Однак XML - це формат, де єдиними межами є те, як ви інтерпретуєте кожен розділ. Оновіть Ваше запитання детальним прикладом, і я покажу xml, який може це впоратися. Внутрішня логіка гри звучить так, як вона повинна бути внутрішньою?
AbstractChaos

0

Пітон добре, думаю. Часто LUA також є хорошою альтернативою, якщо ви хочете додати можливості своїх сценаріїв до своїх програм.

Ви можете або використовувати XML для опису поведінки своїх монстрів, це включатиме деяке кодування у фактичному ігровому коді, оскільки ви збережете лише "ім'я" або деякі атрибути відповідно до поведінки (швидкість, тип зброї, яку монстр використовує, тощо) поведінки, яку слід використовувати у вашому ігровому коді.

Якщо ви використовуєте Scriptengine (наприклад, LUA), ви можете перенести цей код зі своєї попередньо складеної програми у скрипт-файли, що завантажуються під час виконання. Для цього вам доведеться виставити API своїх «монстрів» скриптенгіну. Це дозволяє викликати методи коду монстр-гри ззовні.


API мого монстра? Я маю на увазі, мені доведеться вміти створювати нові компоненти із сценарію (інстанція). Це можливо?
Натан

Афаїк це має бути можливо. Ви також можете скористатися змішаним підходом до зовнішнього сховища (наприклад, згадуваного абстрактних хаосів або байтів56) та мови сценаріїв (LUA, Python ...). Основна перевага, наприклад, LUA полягає в тому, що ви можете змінити свій код під час виконання, і він моментально доступний у вашій запущеній грі / двигуні
Aron_dc

Хо серйозно? Це справді величезна перевага Також у мене є хоч LUA (або інша мова сценаріїв) для "ігрової шкали". Я маю на увазі, щоб створити декілька сценарних сцен, де гравця потрібно заблокувати, цей спрайт повинен рухатись сюди, запалювати тут і там… То, може, я можу також використати мову скрипта для завантаження сутності? Також я збираюсь поставити ще одне питання, щоб викрити свій поточний спосіб управління суттю / компонентами над тим, що я називаю "менеджером", щоб побачити, чи добре мені.
Натан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.