Яка технологія дозволяє програмувати всередині гри?


27

Є деякі ігри, які дозволяють гравцеві писати / створювати сценарії в грі, наприклад: Космічні інженери або Psi .

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

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

Під галуззю програмування я маю на увазі щось на кшталт PTG (Procedural Terrain Generation).

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


22
Ну, напевно, "Написання перекладачів"?
MatthewRock

2
Нещодавно я відповів на подібне запитання , обговорюючи " Віртуальну машину " як термін для системи, що управляє кодом користувача, а також посилаючись на статтю "Шаблони програмування ігор" на шаблоні байт- коду як на спосіб реалізації цього швидше, ніж звичайний інтерпретатор.
DMGregory

3
Зазвичай це називається "сценарієм". Ви знайдете безліч матеріалів про те, як реалізувати сценарії в грі, а також безліч (різноманітно) зразка з відкритим кодом та реального коду. У більш широкому обсязі є ціле поле програмування компілятора (яке включає лексинг, аналіз, компіляцію, зв’язування, інтерпретацію ...). У найширшому обсязі (не обов’язково корисно) це тягне за собою майже будь-яку взаємодію користувачів з вашою програмою - сценарій створення сценаріїв - це просто набагато складніший спосіб вибору з меню.
Луань

2
Програма Python може розміщувати сценарії Python. Це називається метапрограмуванням. Більшість інтерпретованих мов мають це.
користувач6245072

1
AFAIK у космічних інженерів складається з кодом C # у пісочному середовищі (гра пішла з відкритим кодом, щоб ви могли перевірити, як це працює в Інтернеті: github.com/KeenSoftwareHouse/SpaceEngineers ). В основному гра постачається з компілятором C # і код дозволяє лише доступ до функцій API гри, так що сфера програми обмежена лише вами. А якщо ви граєте в мультиплеєр, код працює лише на вашій машині (інші гравці / сервер просто бачать наслідки гри)
Florian Castellane

Відповіді:


42

Сценарії, написані сценаріями / вбудованими / інтерпретованими мовами, такими як "Lua", "Lisp" або "AngelScript" ( докладніше тут ), можна оновлювати під час гри [*], а потім інтерпретувати (= виконувати) на льоту.

Ви можете прив’язати елементи з цих сценаріїв до рідного скомпільованого кодування (C ++ тощо), щоб потім сценарії могли виконувати логіку з вашої програми. E. g. певна команда, яку користувач може ввести в сценарій, в результаті переміщує ігровий персонаж на задану відстань в ігровому світі.

Деякі відповідні питання:


[*] або користувачем у рамках гри, або також розробниками для швидкої ітерації / тестування без перезавантаження програми


14
Я був би обережним, називаючи щось "інтерпретована мова". У кращому випадку це дуже спірний термін.
wondra

1
Computercraft (minecraft mod) використовує LUA як мову сценаріїв для програмування завдань в грі.
Тікеб

20
Я не дуже розумію метушні. Lisp можна як інтерпретувати, так і складати. Ми тут не для того, щоб відмовлятись від того, як класифікувати мови та чи interpretedхороша класифікація; ми говоримо ОП, хто не знає про цей факт, що мову не потрібно складати, але її можна інтерпретувати - і ми наводимо деякі мови як приклад. Чи тлумачить Лісп? Так. Чи складено? Також так! Але це поза сферою. Відповідь може бути неточною з формулюванням, але це добре для мети; це підштовхує ОП у правильному напрямку, і саме це враховує. Ось, візьміть мій +1.
MatthewRock

1
Ну а якщо мова лише для компіляції, що заважає вам вставляти IDE, компілятор та час виконання у вашу гру? За винятком бюджету, тобто.
Звичайний

3
@DanielJour Хоча я погоджуюся, що теоретично мова може відрізнятися від її реалізації (компільована до машинного коду проти компільованого до байт-коду для vm), це все ще корисне припущення про економію часу, що C збирається, якщо не вказано інше (і ви можете собі уявити погляди, які ви отримаєте, якби ви кожен раз запитували "почекати, складати C або інтерпретувати C?" Для цілей ОП йому потрібно вивчити мови, які підтримують тлумачення; чи вони можуть бути складені чи ні, це не питання, оскільки він не використовує це.
Blackhawk

12

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


11

Ви шукаєте спосіб зміни коду на деякі дії. Саме цим займаються перекладачі .

Погляньте на Python. Ви запускаєте це, і бам! Ви приземляєтесь у REPL ( R ead E val P rint L oop).

Ви визначаєте функцію "привіт", яка друкує "Привіт, світ". І там у вас є!

Зауважте, що ви нічого не склали; Інтерпретатор зробив якусь магію, щоб створити функцію на льоту (під час виконання), і тепер ви можете це зателефонувати.

Те саме стосується ігор. Замість того щоб мати REPL, у вас є гра з модулем REPL. Гра, ймовірно, запускає REPL, а потім запускає все інше в цій REPL, тож ви маєте доступ до даних і можете активно їх змінювати.

Якщо ви працюєте з величезними мовами, такими як C ++, вони, як правило, менш динамічні та, ймовірно, компільовані. Ви хочете трохи простіше. Ви або створюєте свою власну мову, або використовуєте деякі існуючі (наприклад, CoffeScript, Білка, Луа, Схема, ...)

Їх часто називають скриптовими мовами , оскільки ви використовуєте їх для написання сценаріїв , побудованих на ігровому двигуні, розробленому на іншій мові (наприклад, C ++).


2

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

Перевага (і недолік) мов, що належать до домену, полягає в тому, що сама мова може обмежувати, що може робити користувач (тобто ви можете заборонити підключення до Інтернету). Ви можете створити мову, яка робить типові ігрові завдання легшими, ніж у мові загального призначення. Недоліком є ​​те, що користувач має вивчити нову мову.

Тільки запуск несанітизованого коду користувача загальною мовою (наприклад, python чи perl) у вашій грі може дозволити користувачеві возитися з речами, з якими він не повинен возитися. Але це залежить від вашої гри. Якщо ви не заперечуєте проти того, щоб користувачі робили такі речі, як відкриття нових вікон у вашій грі або що завгодно, ви можете використовувати мову загального призначення та викривати прив’язки до певних особливостей вашого ігрового світу.


1

Є два приклади, які я можу придумати вгорі голови. Здається, що обидва роблять саме те, що ви просите.

Перший - це шпильки. https://screeps.com/ Ви можете прочитати багато про те, як він досягає цієї мети на веб-сайті http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview

Друга - ComputerCraft http://www.computercraft.info/ Вони не вкладаються в деталі щодо того, як це працює, але трохи їх можна побачити на їхній вікі http://www.computercraft.info/wiki/Main_Page

По суті, основна гра запускає інтерпретатора в окремий потік, потім дозволяє цьому потоку маніпулювати ігровим світом через дзвінки API.

В обох прикладах, хоча мова майже необмежена (лише деякі дзвінки заблоковані з міркувань безпеки), маніпуляції обмежені викликами API, які можна здійснювати.

Зазвичай для того, щоб почати щось подібне, потрібно дуже мало роботи. Тобі потрібно

  • менеджер потоків, який захищає цикл вашої гри (не дозволяє потоку замикати цикл або використовувати багато ресурсів). В обох прикладах використовується часовий обмежувач.
  • перекладач для ведення мови. LUA досить поширений в ці дні.
  • набір API-викликів, що змінюють ігровий світ. Яка забава - це мова програмування, якщо ви нічого не можете з цим зробити.
  • реалізація управління ресурсами. Іншими словами, спосіб зберігати файли коду та посилатись на них у грі.

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


0

Скомпільований виконуваний файл повинен містити аналізатор , здатний читати зовнішній код програми . Код програми не повинен виглядати як C або Python чи xyz - це можуть бути будь-які описові дані, що підходять для цілі, про яку йдеться. Наприклад шведська, або морзе.

Зовнішній програмний код повинен мати синтаксис , щоб аналізатор розумів його під час читання символу за символом. Синтаксис може описувати (і код може містити) ідентифікатори, числові значення, оператори тощо .

Аналізатор виправлений (компілюється), але він працює на гнучкому зовнішньому коді.

Скомпільований виконуваний файл повинен мати внутрішній API для його відповідного функціоналу. щоб парсер міг виконувати дії. Швидше за все, повинен бути (двонаправлений) доступ і до внутрішніх даних виконуваного файлу, або аналізатор повинен забезпечити певний тип зберігання та ведення ведення даних.

Аналізатор може прочитати зовнішній код програми при запуску виконавчого файлу , або він може прочитати (частини) його ad hoc , або він може перечитати його в кожному кадрі (було б неефективно), або код можна навіть ввести вручну і розміщується в аналізаторі по мірі готовності (наприклад: "перемістити блок X вперед на 5 кроків" [ввести]).

По суті, зовнішній код не виправлений - він може змінюватися в будь-який рік, день або хвилину, але все ж виконуваний файл не потрібно повторно компілювати. Змінюється лише результуюча поведінка, розміщена виконуваним файлом.

Текст, який ви зараз читаєте, (вид і навіть більше, якщо він був промовлений) інтерпретується тому, що ви «виконайте» його в головному мозку, читаючи його, не знаючи, що говорить наступне речення (або навіть, якщо це можливо, підлість змінюється правильно) зараз). На відміну від переповнення стека (попередньо) компілюючи всю історію в байт-код у вашому мозку, який потім виконує її - і ofc тоді вона більше не може змінюватися.

У Phenomen триває є interpretion. Сценарій - це лише акт створення deSCRIPTion або написання . Всі комп'ютерні кодування - це сценарій imo - ми описуємо, що ми хочемо статися. Слово «сценарій» набуло дещо нахиленого значення, але будьте добре. Ми знаємо, що ми маємо на увазі.

З інтерпретованими мовами немає абсолютно нічого надзвичайного, і це жодним чином не спірний термін . Їх існує безліч, а деякі найдавніші трактуються на відміну від складених. Інтерпретованою мовою можна, наприклад, ввести вручну:

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... а потім піти на 30 ... ні, 45 хвилинну перерву на каву :-). Повертаючись, "шкарпетка" існує і готова до подальшого використання, набравши більше вручну або дозволяючи автоматизації перекладача продовжувати роботу.


Існує поширена помилка, що мова, яку інтерпретують, повинна бути повільною. Це неправда. Залежно від різних факторів, які роблять це обговорення занадто широким для коментарів, інтерпретована мова може бути на величину або менш повільною, швидкою, або навіть для деяких операцій швидшою, ніж контрольна мова, яка вважається швидкою (зазвичай це C). Приклад з socket, ймовірно, буде працювати більш-менш, як у C, тому приклад вводить в оману. Ви також можете переглядати скомпільовані функції під час виконання на деяких мовах, а інтерпретація не означає просто "проходження однієї інструкції одночасно".
MatthewRock

Звичайно, інтерпретована мова може працювати і швидше - адже виконується байт-код, і виконання може бути значно краще оптимізоване, залежно від автоматизації перекладача. Крім того, деякі перекладачі можуть складати з коду, частини коду в байт-код (і виконувати), ad hoc. Приклад - це лише приклад свободи: "Виконуючи одну інструкцію за часом"? Ну це надмірне спрощення, можливо, додайте ", поки майбутній код є гнучким".
Stormwind

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