Скриптовые языки в рогаликах - как это делается? (Lua)
Модераторы: Sanja, Максим Кич
Скриптовые языки в рогаликах - как это делается? (Lua)
Интересуют принципы использования скриптовых языков - в частности, Lua.
Есть у меня мой проект на языке С++, есть Lua. И вот интересно, в какое именно место надо встраивать скрипты и каким именно образом?
Т.е. при ударе мною моба вызывается скрипт Lua, в который передается тип, защита, сила и т.п. моба и мои характеристики? И там уже всё это дело рассчитывается по определённым формулам? Этот вопрос более-менее понятен.
Но если этот скрипт должен поменять какие-то переменные в моем проекте - например, убавить HP моба, сделать его испуганным плюс силой удара откинуть от себя на две клетки если там есть место? Вот больше всего интересует это обратное взаимодействие из Луа на классы С++, как это реализуется? Пишутся под это отдельные методы в классе?
Вообще только начал изучать этот самый Луа, и в идеале хотелось бы увидеть пример, как именно реализуется взаимодействие С++ и Lua.
И насколько оправдано использование скриптовых языков в рогаликах - проекты не сильно большие, компилируются быстро, можно всё это дело и на С++ писать. С другой стороны скрипты можно править не выходя из игры. Или нельзя?
Есть у меня мой проект на языке С++, есть Lua. И вот интересно, в какое именно место надо встраивать скрипты и каким именно образом?
Т.е. при ударе мною моба вызывается скрипт Lua, в который передается тип, защита, сила и т.п. моба и мои характеристики? И там уже всё это дело рассчитывается по определённым формулам? Этот вопрос более-менее понятен.
Но если этот скрипт должен поменять какие-то переменные в моем проекте - например, убавить HP моба, сделать его испуганным плюс силой удара откинуть от себя на две клетки если там есть место? Вот больше всего интересует это обратное взаимодействие из Луа на классы С++, как это реализуется? Пишутся под это отдельные методы в классе?
Вообще только начал изучать этот самый Луа, и в идеале хотелось бы увидеть пример, как именно реализуется взаимодействие С++ и Lua.
И насколько оправдано использование скриптовых языков в рогаликах - проекты не сильно большие, компилируются быстро, можно всё это дело и на С++ писать. С другой стороны скрипты можно править не выходя из игры. Или нельзя?
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Видимо мало кто с этим сталкивался. Читаю сейчас http://steps3d.narod.ru/tutorials/lua-tutorial.html .
Нашел книгу Роберта Иерузалиски "Программирование на языке Lua", где он в конце книги описывает взаимодействие кода на С и скриптов lua в одну и другую сторону.
Вообще использование скриптов, судя по уже прочитанному, очень актуально для больших и тяжелых проектов, где компиляция может занимать 8-10 часов и более, т.е. после внесения некоторых изменений в игровую логику результат можно будет увидеть только на следующий рабочий день. Ну и если не желаешь выкладывать исходный код, но хочешь, чтобы для твоей замечательной игры было сделано много разных модов игроками.
Плюс еще удобно править баланс - ударил моба, посмотрел результат,поставил игру на паузу, если не походовая, поправил скрипт, ударил моба, прямо сразу увидел результат, как-то так.
Нашел книгу Роберта Иерузалиски "Программирование на языке Lua", где он в конце книги описывает взаимодействие кода на С и скриптов lua в одну и другую сторону.
Вообще использование скриптов, судя по уже прочитанному, очень актуально для больших и тяжелых проектов, где компиляция может занимать 8-10 часов и более, т.е. после внесения некоторых изменений в игровую логику результат можно будет увидеть только на следующий рабочий день. Ну и если не желаешь выкладывать исходный код, но хочешь, чтобы для твоей замечательной игры было сделано много разных модов игроками.
Плюс еще удобно править баланс - ударил моба, посмотрел результат,поставил игру на паузу, если не походовая, поправил скрипт, ударил моба, прямо сразу увидел результат, как-то так.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Думаю можно начать со списка библиотек привязки. Общая идея у всех примерно одна: методами библиотеки описываются-регистрируются прокидываемые в Lua функции и классы С++, специально ради этого делать что-то с кодом на С++ обычно не нужно.altmax писал(а):Вот больше всего интересует это обратное взаимодействие из Луа на классы С++, как это реализуется? Пишутся под это отдельные методы в классе?
Увы, не скажу за roguelike, но вот в кровавом продакшене где даже на рестарт приложения надо спрашировать разрешение заказчика >_< я использовал LuaBridge (кажется уже заброшенный) для вынесения из приложения часто пополняемого/исправляемого кода по управлению IP-камерами по HTTP. Там на 10 моделей камер обычно 12 вариантов протокола с несовместимыми нюансами =(.altmax писал(а):Вообще использование скриптов, судя по уже прочитанному, очень актуально для больших и тяжелых проектов, где компиляция может занимать 8-10 часов и более, т.е. после внесения некоторых изменений в игровую логику результат можно будет увидеть только на следующий рабочий день.
Пытается раскуклиться
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Отвечу по рогаликам, не важно по какому скриптовому языку. Тут главное соблюсти баланс, какой код будет в движке, а какой вынесется в скрипты. Иногда в скрипты выносят даже то, что должно быть в базе данных игры. Я считаю так делать не стоит. Отдельно двиг, отдельно база и отдельно скрипты.
Луа очень интерессный язык, простой, но мощный. Хорошо подходит для скриптования. Но я сейчас увлекся go
Луа очень интерессный язык, простой, но мощный. Хорошо подходит для скриптования. Но я сейчас увлекся go
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Нашел на Хабре статью именно по Luabridge, потому пока думаю экспериментировать с ним. А так да - его забросили 4 года назад, новые функции Lua 5.3 он не поддерживает.Cfyz писал(а): ↑26 фев 2017, 10:28Увы, не скажу за roguelike, но вот в кровавом продакшене где даже на рестарт приложения надо спрашировать разрешение заказчика >_< я использовал LuaBridge (кажется уже заброшенный) для вынесения из приложения часто пополняемого/исправляемого кода по управлению IP-камерами по HTTP. Там на 10 моделей камер обычно 12 вариантов протокола с несовместимыми нюансами =(.
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Два часа бился с этим LuaBridge. В итоге вызвать из скрипта функцию С++ и передать в неё значения смог легко, а вот изменить переменную С++ из скрипта так и не смог, вываливается исключение этого самого LuaBridge сразу после объявления getGlobalNamespace (L).addVariable ("perem", &perem);. Но может оно и к лучшему - пусть уже функции С++ контролируют, что там пришло из скрипта и прописывают в нужные структуры данных, тем более изменять конкретную переменную редко требуется, обычно надо изменить поле в массиве структур, которое можно изменить только через метод Get в соответствующем классе.
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Фух, я его победил. Ушло на это чуть более 2 недель. Основная проблема была - как вызвать из lua методы уже существующего экземпляра класса. Вот полно описаний, как вызвать функцию С++ из скрипта и наоборот, вызвать скрипт из С++. Или как из скрипта создать объект класса С++. А вот вызвать методы уже существующего экземпляра класса из скрипта - нашел только одну толковую статью и то на английском языке. Но статья помогла, два часа вдумчивого изучения - там просто много лишнего было - и оказалось, что проблема решается очень просто. Но нигде про это не написано, типа изобретайте сами.
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Теперь впечатления по истечении нескольких месяцев - стоило ли оно того, чтобы разбираться в течение месяца?
Однозначно стоило, весь ИИ сделан на скриптах, а его отладка - очень длительный процесс, когда приходится вручную перебирать массу параметров. Если после каждого изменения параметра перекомпилировать и перезапускать игру - никакого времени не хватит. А тут - открыл скрипт, поправил его, записал - и он уже работает, больше ничего делать не надо. Даже из игры выходить.
Да и все эти огромные if - then - else гораздо лучше смотрятся в отдельных скриптах, а не в движке игры.
Плюс движок остается статичным, а путем написания соответствующих скриптов можно сделать хоть киберпанк, хоть постап, хоть магический рогалик.
Но есть и небольшой минус - сами функции в скриптах не появятся, их все надо забиндить из основного кода игры. У меня так прописано более 200 функций, которые позволяют практически полностью управлять игрой из скриптов. Некоторые даже по два раза с разными названиями - просто забывал, что такие функции уже есть. Потому необходимо еще и подробное описание, прежде всего для самого себя.
Если тема кому-нибудь будет интересна (конкретно - использование скриптов Lua в игре на С++, как всё это сделано с примерами кода) - могу написать подробный мануал. Там просто объем достаточно большой получается, не хотелось бы писать в никуда.
Однозначно стоило, весь ИИ сделан на скриптах, а его отладка - очень длительный процесс, когда приходится вручную перебирать массу параметров. Если после каждого изменения параметра перекомпилировать и перезапускать игру - никакого времени не хватит. А тут - открыл скрипт, поправил его, записал - и он уже работает, больше ничего делать не надо. Даже из игры выходить.
Да и все эти огромные if - then - else гораздо лучше смотрятся в отдельных скриптах, а не в движке игры.
Плюс движок остается статичным, а путем написания соответствующих скриптов можно сделать хоть киберпанк, хоть постап, хоть магический рогалик.
Но есть и небольшой минус - сами функции в скриптах не появятся, их все надо забиндить из основного кода игры. У меня так прописано более 200 функций, которые позволяют практически полностью управлять игрой из скриптов. Некоторые даже по два раза с разными названиями - просто забывал, что такие функции уже есть. Потому необходимо еще и подробное описание, прежде всего для самого себя.
Если тема кому-нибудь будет интересна (конкретно - использование скриптов Lua в игре на С++, как всё это сделано с примерами кода) - могу написать подробный мануал. Там просто объем достаточно большой получается, не хотелось бы писать в никуда.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Такой функционал реализован на паскале в движке valkyrie, можно по исходникам дрл или диаблорл посмотреть, как устроено.
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
ГДЕ МАНУАЛ!??! Я не хочу изучать это всё с нуля)
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
А есть ли смысл? Я не согласен с мыслью, что рогалик должен быть разбит на две части, движок и скрипты. Если не планировать графику, то единой кодобазы (и, соответственно, одного языка программирования) вполне хватит, с графикой немного сложнее, какой-нибудь Forth имеет очень мало графических библиотек, но вот конкретно Lua - какие там проблемы? Есть специальные графические движки для Lua, заточенные под игры, зачем там С++?
Re: Скриптовые языки в рогаликах - как это делается? (Lua)
На самом деле смысл есть - разрабатывать так рогалик гораздо проще. Любые правки можно вносить так сказать онлайн, и они сразу действуют, даже перезапускать не надо рогалик. Или надо, зависит от реализации биндинга. Но по крайней мере не надо перекомпилировать весь код. а когда отлаживаешь ИИ - там бывает вносишь сотни правок, пока не начнёт работать как надо.Bioworm писал(а): ↑13 апр 2018, 23:21
А есть ли смысл? Я не согласен с мыслью, что рогалик должен быть разбит на две части, движок и скрипты. Если не планировать графику, то единой кодобазы (и, соответственно, одного языка программирования) вполне хватит, с графикой немного сложнее, какой-нибудь Forth имеет очень мало графических библиотек, но вот конкретно Lua - какие там проблемы? Есть специальные графические движки для Lua, заточенные под игры, зачем там С++?
Или если есть развитая система крафта или заклинаний, эффективность которых зависит от многих факторов - всё это проще держать в скриптах lua. Ну и если цель создать конкретный рогалик, который потом будет практически неизменен - можно и без скриптов обойтись. А если проектируешь расширенный движок, на базе которого потом можно создавать рогалики в различных сеттингах - хоть средневековая магия, хоть киберпанк - то тут уже тоже лучше подключить скрипты.
А на С++ делаются те части движка, которые сильно нагружают процессор. Например, генерация уровня - часто даже на современных процессорах время часто измеряется секундами. Или класс, в котором хранятся все существующие на уровнях предметы - тоже получается очень объемным, и время поиска нужного объекта занимает достаточно много времени. Ну и в основном конечно С++ применяется из-за своей объектноориентированности. Благодаря наличию классов и наследованию некоторые вещи делаются гораздо проще, чем без них.
Постараюсь уложиться в 1 год. Раз кого-то заинтересовало, таки придется написать мануал.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя