Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Специфическая задача. Язык сценариев

Специфическая задача. Язык сценариев

Поделиться
nuke_birdНовичокwww1 ноя. 201717:11#0
(нет, разделом не ошибся :3)

Мне нравится программировать на С++ для души, это моё хобби. Но я недостаточно талантлив, чтобы сделать весь контент для полноценной игры.

Всегда засматривался на 64К демо под музыку. Решил сделать что-то похожее, но не ограничивая себя в плане ресурсов

Итак. Сцена стартует - начинает играть музыка. В определенных интервалах времени могут происходить различные события, например:
1)изменить графический эффект
2)изменить/добавить объект
3)изменить положение объекта(ов) сцены
4)добавить текст
5)да в принципе что угодно, на что только хватит фантазии

Теперь ближе к сути ВОПРОСА: чем можно грамотно описать сценарий демо?
Все, в принципе, сводится к: <интервал>: <перечень событий, действий и т.п.>

Справятся ли с real-time'ом обычные скриптовые языки по типу LUA?
Как понимаю, на каждый интервал должен быть свой скрипт (как именовать? Их же будет много!)

Как регистрировать интервалы? Через какой-нибудь main.lua?

Скрипты для каждого интервала должны быть скомпилированы заранее, во время загрузки сцены?

А можно ли скомпоновать кучу разных (независимых) скриптов в одну кучу, чтобы с ними работала лишь одна VM?


Крайне извиняюсь за топорные вопросы. Вообще, у меня уже есть видение возможной реализации задумки, просто я не уверен что оно корректное.
Поделитесь со мной своим опытом, пожалуйста 

nuke_birdНовичокwww1 ноя. 201717:12#1
nuke_bird
> (нет, разделом не ошибся :3)
(а не ошибся, потому что по большому счету события будут менять эффекты и параметры шейдеров, ну и работать с рендером на "ты")

Правка: 1 ноя. 2017 17:12

ArochПостоялецwww1 ноя. 201718:51#2
nuke_bird
> Справятся ли с real-time'ом обычные скриптовые языки по типу LUA?
да
> Как понимаю, на каждый интервал должен быть свой скрипт (как именовать? Их же
> будет много!)
не обязательно, можешь как угодно сделать, хоть вызывать одну функцию call_event(time) а в скрипте уже пишешь все остальное.
> Как регистрировать интервалы? Через какой-нибудь main.lua?
если делать через call_event как выше, то можно и не регистрировать, хост программа вообще не будет знать о каких то событиях, будет только передавать время. А так опять же как хочешь обзывай.
> Скрипты для каждого интервала должны быть скомпилированы заранее, во время
> загрузки сцены?
да без разницы, сомневаюсь что у тебя будут скрипты на сотни тысяч строк. Большую часть времени займет обращение к диску и считывание файла.
> А можно ли скомпоновать кучу разных (независимых) скриптов в одну кучу, чтобы с
> ними работала лишь одна VM?
можно.

nuke_birdНовичокwww1 ноя. 201719:16#3
Aroch
> не обязательно, можешь как угодно сделать, хоть вызывать одну функцию
> call_event(time) а в скрипте уже пишешь все остальное.
Пусть дана музыка длительностью 4 минуты, т.е. 60'000 мс
Необходимо изменять происходящее на сцене в среднем каждые 300 мс (на самом деле это число может быть и меньше, например если я хочу под музыку переключать различные эффекты) 
Получается, что получится около 200 интервалов.
События, конечно, могут повторяться, но их всех все равно как-то не хочется хардкодить в одном файле - глаза потом будут бо-бо
ArochПостоялецwww1 ноя. 201719:22#4
nuke_bird
> События, конечно, могут повторяться, но их всех все равно как-то не хочется
> хардкодить в одном файле - глаза потом будут бо-бо
1) нормальная ide
2) писать в нескольких если так уж хочется

И коль использовать одну VM, то ты можешь из любого скрипта обращаться к функциям/данным других скриптов которые были уже загружены. У меня так сделано.

loysoПостоялецwww2 ноя. 201714:32#5
nuke_bird
Зафигач в https://github.com/loyso/LuaCSP !
loysoПостоялецwww3 ноя. 20177:25#6
nuke_bird
> чем можно грамотно описать сценарий демо?
На самом деле Lua и LuaCSP - будет забегание вперед опыта.

Начни с чего-то простого. Типа нескольких конечных автоматов, последовательно переключающих свои "длящиеся состояния" (эффекты, контроллеры) во времени.

loysoПостоялецwww3 ноя. 20177:36#7
nuke_bird
Ключевые моменты, псевдо-код:
enum class Status { InProgress, Stopped };

class Effect {
  virtual Status Update(time_t dt) = 0;
};

class Sequencer {
  using EffectTrack = vector<unique_ptr<Effect>>;
 
  EffectTrack m_mainEffectTrack;
  EffectTrack m_soundTrack;
  EffectTrack m_subtitlesTrack;
  EffectTrack m_cameraTrack;
};

class Pause : public Effect {
  Status Update(time_t dt) override {
     m_duration -= dt;
     return m_duration > 0 ? Status::InProgress : Status::Stopped;
  }
  time_t m_duration;
};
Наследники Effect - это контроллеры всевозможные. Типа "повернуть объект, указанный аргументом, на 90 градусов вокруг оси за 1 минуту".
И напихиваешь контент сиквенсеров через xml/json/свой простой язык/или composite паттерном в C++.
Сиквенсер тогда будет что-то типа интерпретатора CSP на дереве инструкций.

Правка: 3 ноя. 2017 8:10

Daniil PetrovПостоялецwww3 ноя. 20179:58#8
Вот у меня, кстати, тоже вопрос :))) как лучше оформить обработчик событий - т.е. создать событийную схему или, например, кадровые ключи и обрабатывать всё это дело... лучше вместе и покадровые ключи, и события?
loysoПостоялецwww3 ноя. 201714:53#9
Daniil Petrov
Вопрос сформулирован непонятно.
Если принять что демо должно быть интерактивно (реагировать на сообщения от пользователя, простейший пример - пробелом прокликиваем текущую сцену)
то сообщения - это те самые каналы из CSP (C - Communication).

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр