Есть некоторые игры, которые позволяют игроку писать / создавать сценарии в игре, например: Космические инженеры или Пси .
Я хочу использовать что-то похожее на одно из них, но мне было трудно найти информацию, поэтому мой вопрос:
Есть ли ветка программирования, которая охватывает способность программного обеспечения после компиляции запускать новый код, созданный пользователем?
Под ветвью программирования я имею в виду что-то вроде PTG (Procedural Terrain Generation).
Чтобы избежать слишком широкого вопроса или основанного на мнениях мнения , позвольте мне четко заявить, что я не ищу руководства или места для изучения, я хочу название или определение (если таковое существует) задействованной технологии.
scripting
terminology
Вестсайд Тони
источник
источник
Ответы:
Скрипты, написанные на скриптовых / встроенных / интерпретируемых языках, таких как «Lua», «Lisp» или «AngelScript» ( подробнее здесь ), могут обновляться во время игры [*], а затем интерпретироваться (= исполняться) на лету.
Вы можете привязать элементы из этих сценариев к вашей собственной скомпилированной кодировке (C ++ и т. Д.), Чтобы сценарии могли затем выполнять логику из вашего приложения. Например конкретная команда, которую пользователь может ввести в сценарий, в результате чего персонаж в игре перемещается на заданное расстояние в игровом мире.
Некоторые соответствующие связанные вопросы:
Какой язык сценариев выбрать для своей игры?
Что вы ищете на языке сценариев?
Как добавить язык сценариев в игру?
[*] либо пользователем как частью игры, либо разработчиками для быстрой итерации / тестирования без перезапуска приложения
источник
interpreted
является ли это хорошей классификацией; мы говорим OP, кто не знает об этом факте, что язык не нужно компилировать, но можно интерпретировать - и приведем несколько языков в качестве примера. Лисп интерпретируется? Да. Это скомпилировано? Тоже да! Но это выходит за рамки. Ответ может быть неточным с формулировкой, но он подходит для этой цели; это подталкивает OP в правильном направлении, и это то, что имеет значение. Вот, возьми мой +1.Встроенный язык - это правильный технический термин. На практике языки, которые используются внутри других приложений (таких как игры), часто называют скриптовыми или даже интерпретируемыми языками, хотя они не обязательно должны интерпретироваться или использоваться для автоматизации рутинных задач. Поиск в Google «языков сценариев для игр», вероятно, даст более полезные результаты, чем поиск «встроенных языков».
источник
Вы ищете способ изменить код на некоторые действия. Это именно то, что делают переводчики .
Посмотрите на Python. Вы управляете этим, и бац! Вы высадиться в REPL ( R EAD E VAL P Ринт L полокоть).
Вы определяете функцию "привет", которая печатает "Привет, мир". И вот оно!
Обратите внимание, что вы ничего не компилировали; Интерпретатор немного поработал, чтобы создать функцию на лету (во время выполнения), и теперь вы можете вызывать ее.
То же самое относится и к играм. Вместо REPL у вас есть игра с модулем REPL. Игра, вероятно, запускает REPL, а затем запускает все остальное в этом REPL, поэтому у вас есть доступ к данным и вы можете их активно изменять.
Если вы работаете с огромными языками, такими как C ++, они, как правило, менее динамичны и, вероятно, скомпилированы. Вы хотите немного проще. Вы либо создаете свой собственный язык, либо используете какой-то существующий (например, CoffeScript, Squirrel, Lua, Scheme, ...)
Их часто называют языками сценариев , так как вы используете их для написания сценариев , построенных на игровом движке, разработанном на каком-либо другом языке (например, C ++).
источник
Если язык программирования в игре был разработан только для игровых целей, то это язык, специфичный предметной области .
Преимущество (и недостаток) языков, специфичных для предметной области, заключается в том, что сам язык может ограничивать возможности пользователя (т.е. вы можете запретить подключение к Интернету). Вы можете разработать язык, который делает типичные игровые задачи более легкими, чем на языке общего назначения. Недостатком является то, что пользователь должен изучать новый язык.
Простой запуск неанизированного пользовательского кода на языке общего назначения (например, python или perl) изнутри вашей игры может позволить пользователю связываться с вещами, с которыми ему не следует связываться. Но это зависит от вашей игры. Если вы не возражаете против того, чтобы пользователи занимались такими вещами, как открытие новых окон внутри вашей игры или что угодно, вы можете использовать язык общего назначения и выставлять привязки к определенным функциям вашего игрового мира.
источник
Есть два примера, которые я могу придумать с головы до головы. Оба, кажется, делают именно то, что вы просите.
Первый - это крики. 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, которые можно выполнять.
Обычно, чтобы начать что-то подобное, требуется совсем немного работы. Тебе нужно
Нет единой ветви программирования, которая бы занималась всеми этими проблемами. Но вам понадобится прочная основа для многопоточности и общие знания о том, как работает переводчик.
источник
Скомпилированный исполняемый файл должен содержать анализатор , способный читать внешний программный код . Код программы не обязательно должен выглядеть как C или Python или xyz - это могут быть любые описательные данные, которые подходят для рассматриваемой цели. Например, шведский или азбука Морзе.
Код внешней программы должен иметь синтаксис , чтобы синтаксический анализатор понимал его, как он читает его символ за символом. Синтаксис может описывать (и код может содержать) идентификаторы, числовые значения, операторы и т . Д.
Парсер исправлен (скомпилирован), но работает с гибким внешним кодом.
Скомпилированный исполняемый файл должен иметь внутренний API для соответствующей функциональности. так что парсер может выполнять действия. Скорее всего, также должен быть (двунаправленный) доступ к внутренним данным исполняемого файла, или синтаксический анализатор должен обеспечивать какое-то хранение и ведение данных.
Синтаксический анализатор может читать внешний программный код при запуске исполняемого файла , или он может читать (части) его ad hoc , или он может перечитывать его для каждого кадра (будет неэффективно), или код может даже быть напечатан вручную и отправлено парсеру, когда он готовится (например: «переместить блок X вперед на 5 шагов» [enter]).
По сути, внешний код не является фиксированным - он может меняться в любой год, день или минуту, но, тем не менее, исполняемый файл не нужно перекомпилировать. Изменяется только результирующее поведение, размещаемое исполняемым файлом.
Текст, который вы сейчас читаете, интерпретируется (вроде и даже больше, если он был произнесен), потому что вы «исполняете» его в своем мозгу, читая его, не зная, что говорит следующее предложение (или даже если это возможно, хитро меняется в настоящее время). В отличие от переполнения стека (предварительно), скомпилировавшего всю историю в байт-код в вашем мозгу, который затем выполняет ее - и, конечно, она больше не может измениться.
Продолжающееся явление - интерпретация. Сценарии - это только акт создания дескрипции или написания . Все компьютерное кодирование - это imo-скриптинг - мы описываем то, что хотим сделать. Слово «сценарий» имеет несколько измененный смысл, но так будет хорошо. Мы знаем, что имеем в виду.
В интерпретируемых языках нет абсолютно ничего необычного, и это ни в коем случае не спорный термин . Их существует множество, и некоторые из самых старых интерпретируются как скомпилированные. В интерпретируемом языке можно, например, напечатать вручную:
sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]
... а потом пойти на 30 ... нет, 45-минутный перерыв на кофе :-). При возврате «носок» существует и готов к дальнейшему использованию, печатая больше вручную или продолжая автоматизацию интерпретатора.
источник