# Первые шаги
# Благодарности
- Создателям отличного гайда в Steam (opens new window), на котором основано данное руководство:
- HenсoDesu (opens new window) - за создание гайда в Steam.
- Владе (opens new window) - за создание интересных модов и за помощь в дополнениии руководства в Steam.
- Лене (opens new window) - за помощь в коментариях всем, кто столкнулся с затруднениями в Steam и создание полезных модификаций.
- Nikolas Khikkanov (opens new window) | poi (opens new window) - за помощь в создании данного руководства.
- Stepan Kupryashin (opens new window) | СТЕПАН4ик (opens new window) - за помощь в создании данного руководства.
- Алексей Буянин (opens new window) и Андрей Варфоломеев (opens new window) - за предоставление статей для руководства
- Авторам модификации "7 Дней Лета" (позднее - "7 Дней Лета - Lost Alpha" (opens new window)) - за предоставленные ресурсы. Использование только в рамках лицензии CC BY-NC-SA 4.0 (opens new window).
- Группе "Как создать свой мод для игры Бесконечное Лето" (opens new window) и всем тем, кто наполнял её полезным контентом, часть из которого присуствует в данном руководстве.
- Команде "GM-Mod" (opens new window) - за предоставленные ресурсы из модификации "Свобода или Счастье" (opens new window).
- Группе "Загрузчик модов для Бесконечного лета" (opens new window) - за портирование модов на моб. устройства и создание ESTool (opens new window).
# Предпосылки
- Установленная игра "Бесконечное Лето".
- Текстовый редактор:
- Visual Studio Code (opens new window) + Ren'Py Language (opens new window) - личная рекомендация;
- Atom (opens new window) + language-renpy (opens new window) - синтаксис поддерживается официально (opens new window) создателем Ren'Py;
- Notepad++ (opens new window);
- Sublime Text (opens new window) + Ren'Py Language (opens new window).
# Создание мода
Для начало нужно создать файл с расширением .rpy
. Затем открыть его в текстовом редакторе, и следовать далее по руководству.
# Написание кода
Стиль и синтаксис Ren'Py похож на Python. Если знакомы с ним, то проблем возникнуть не должно.
Файлы состоят из блоков и команд в блоках, например:
<Блок>:
<Команды>
<Блок>
2
3
4
WARNING
Команды в блоках должны везде иметь одинаковый отступ. Будь то 2 или 4 пробела. В большинстве случаев рекомендуется использовать 4 пробела.
В редакторе кода будет по умолчанию выставлено значение отступов, поэтому рекомендуется использовать TAB
для отступов.
WARNING
Следует помнить, что Ren'Py не любит табуляцию, выкидывая ошибку (Traceback) при наличии подобного. Один из вариантов решения подобной проблемы: настройка авто-замены табов на пробелы в настройках Вашего рекдактора/с помощью установки соответствующего расширения.
# Объявление мода
WARNING
Шаги, приведенные ниже крайне важны. Без них мод не будет виден в списке модов в игре.
Для того чтобы игра поняла, что файл (в котором строчки будут написаны) является модом, нужно написать следующее:
init:
$ mods["my_mod"] = "Мой мод"
2
Разберем более детально пример выше:
my_mod
- название начального лейбла мода. При запуске мода, всегда первым начинает запускаться этот лейбл, указанный внутри командых скобок. Не будет виден пользователю. Должен быть уникальным, иначе возможны конфликты с модификациями, имеющими лейблы с таким же названием. Рекомендуется использовать только латиницу!Мой мод
- название мода, которое будет отображаться в списке модов. Допускается использование кириллицы.
Теперь, для того, чтобы игра поняла, где начинается мод, нужно добавить начальный лейбл:
init:
$ mods["my_mod"] = "Мой мод"
label my_mod:
"Реплика"
# Далее будут идти команды
2
3
4
5
6
В коде выше:
- Была объявлена метка (
label
), имя которой обязательно должно соответствовать имени мода, указанного в квадратных скобках. В нашем случае -my_mod
.
TIP
Если вы хотите поменять шрифт в списке, то конструкция будет следующей:
init:
$ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}Мой мод{/font}"
2
Можно использовать как TrueType (.ttf), так и OpenType (.otf) шрифта.
Также можно добавить цвет:
init:
$ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}{color=#45B39D}Мой мод{/color}{/font}"
2
И изменить размер шрифта:
init:
$ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}{color=#45B39D}{size=50}Мой мод{/size}{/color}{/font}"
2
# Написание сценария
Далее, в метке my_mod
можно начинать писать сценарий. В нем используется специальный синтаксис Ren'Py, который мы разберем далее.
# Метки
Использование меток позволяет облегчить процесс создания мода, путем разделения сценария на части.
WARNING
Имена меток должны быть уникальными во избежание конфликтов.
Рекомендуется использовать названия меток, начиная с названия мода, например, my_mod_day1
.
Общий синтаксис метки выглядит так:
label <Название>:
<Команды>
2
# Переходы между лейблами
Есть два вида переходов:
- Прыжок (jump)
label my_mod_day1:
"..."
jump my_mod_day2 # Прыжок на my_mod_day2
label my_mod_day2:
"..."
2
3
4
5
6
В данном случае команды после "прыжка" будут пропущены игрой, например, фраза "действия после прыжка" из примера ниже не будет выведена на экран игрока. Любые другие команды, которые были написаны после прыжка также не сработают.
label my_mod_day1:
"..."
jump my_mod_day2
"действия после прыжка"
label my_mod_day2:
"..."
2
3
4
5
6
7
- Вызов (call)
В этом случае фраза из примера выше будет выведена на экран после завершения действий из метки my_mod_day2
.
label my_mod_day1:
"..."
call my_mod_day2 # Вызов второго лейбла
"Действия после прыжка" # После того, как нас выбросит из лейбла my_mod_day2 командой return, появится данная фраза.
label my_mod_day2:
"..."
2
3
4
5
6
7
Закончить блок можно командой return
. После неё мод будет завершен и будет показано главное меню игры, если до этого мы не вызывали какой-либо из лейблов, а лишь прыгали по ним с помощью команды jump
.
Приведём ещё один пример для наглядности:
label my_mod_day1:
"..."
"Сейчас вызовем другой лейбл!"
call my_mod_day2 # Вызываем второй лейбл
"Второй лейбл закончился, можем продолжать работать на первом."
return # А вот здесь уже, если ничего другого не вызывали, нас выкинет из мода.
label my_mod_day2:
"Вот мы и вызвали второй лейбл. Делаем тут что хотим."
"..."
"Второй лейбл подходит к концу"
return # Заканчиваем вызов лейбла, перескок обратно на первый.
2
3
4
5
6
7
8
9
10
11
12
13
В первом лейбле идут некие действия, затем мы вызываем второй лейбл, в котором тоже идут некие действия. Из-за того, что мы вызвали второй лейбл, а не прыгнули на него, при команде return
внутри вызванного лейбла мод не завершится — нас просто выкинет обратно на первый лейбл, потому что мы прекратили 'вызов' второго лейбла и вернулись обратно на первый. Но! Вернулись не в самое его начало, а продолжили работу после момента с вызовом второго лейбла.
# Реплики
Реплики персонажей имеют следующий общий вид: <ID персонажа> "<Реплика>"
, где:
ID персонажа
- название переменной, которой он был объявлен.Реплика
- текст, который будет говорить персонаж.
Список персонажей и их переменные представлены в таблице по ссылке: Ресурсы игры - Персонажи.
В примере ниже представлен пример реплик Мику и Ульяны, имена которых ещё не известны:
label my_mod:
mip "Привет, ты меня ещё не знаешь, но это я — Мику!"
mip "В данный момент я у тебя отображаюсь как 'Пионерка'."
usg "Привет, а я — Ульянка! Но у тебя я написана как \"Девочка\"."
2
3
4
В первом случае имя пионера или пионерки будет сменено на "Пионер/Пионерка", сохраняя свой цвет. Во втором же случае имя персонажа будет сменено на "Девочка", сохраняя свой цвет.
Смена стиля интерфейса
Есть всего 4 варианта:
prolog_time()
- Интерфейс пролога.day_time()
- Интерфейс дня.sunset_time()
- Интерфейс заката.night_time()
- Интерфейс ночи.
Пример использования:
label my_mod:
$ prolog_time() # Интерфейс изменит стиль на стиль из пролога
"..."
$ day_time() # Интерфейс изменит стиль на дневной
2
3
4
Смена окраски спрайтов согласно времени
Всего существует 3 варианта раскраски спрайтов. Все они происходят через переменную persistent.sprite_time
$ persistent.sprite_time = "day"
— Дневная версия окраски спрайтов.$ persistent.sprite_time = "sunset"
— Вечерняя версия окраски спрайтов.$ persistent.sprite_time = "night"
— Ночная версия окраски спрайтов.
Пример использования смены окраски спрайтов вкупе со сменой стилей интерфейса выглядит так:
label my_mod:
$ day_time() # Смена стиля интерфейса на дневной
$ persistent.sprite_time = "day" # Смена окраски спрайтов на дневную версию.
"..."
$ sunset_time() # Смена стиля интерфейса на вечерний
$ persistent.sprite_time = "sunset" # Смена окраски спрайтов на вечернюю версию.
"..."
$ night_time() # Смена стиля интерфейса на дневной
$ persistent.sprite_time = "night" # Смена окраски спрайтов на ночную версию.
"..."
$ prolog_time() # Смена стиля интерфейса на зимнюю версию. Версию пролога.
$ persistent.sprite_time = "night" # Смена окраски спрайтов на ночную версию.
2
3
4
5
6
7
8
9
10
11
12
Обратите своё внимание, что если в моде не менять значение переменной смены стиля интерфейса и смены окраски спрайтов, то по умолчанию стиль интерфейса будет равен $ prologue_time()
, а окраска спрайтов — $ persistent.sprite_time = "night"
# ADV и NVL режимы повествования
Существует два основных стиля изложения материала, используемых в визуальных новеллах:
ADV
: Визуальные новеллы, созданные в стиле ADV, представляют собой диалог и повествование, выводимые на экран по одной строке за раз, как правило, в окне, расположенном в нижней части экрана.NVL
: Визуальные новеллы, созданные в стиле NVL, представляют собой несколько строк на экране, выводимые одновременно в окне, которое занимает весь экран.
По умолчанию меню отображаются в ADV-режиме, занимая весь экран. Существует также альтернативное представление меню в NVL-режиме, в котором меню отображаются сразу после текущей страницы текста NVL-режима.
Для перехода в NVL-режим повествования используйте следующую команду:
$ set_mode_nvl()
Для перехода обратно в ADV-режим повествования используйте следующее:
$ set_mode_adv()
Примеры перехода в NVL и ADV режимы повествования:
label my_mod:
"По умолчанию стоит adv-режим повествования."
$ set_mode_nvl()
"Теперь повествование ведётся в nvl-режиме."
$ set_mode_adv()
"Повествование вернулось обратно в adv-режим."
2
3
4
5
6
Плавные переходы окон
Не забывайте про плавные переходы для окон, в которых ведётся повествование.
Для ADV-режима:
window hide
— плавное скрытие диалогового окна.window show
— плавное появление диалогового окна.
Для NVL-режима:
nvl show dissolve
— плавное появление NVL-окна.nvl hide dissolve
— плавное скрытие NVL-окна.
Пример использования плавных переходов окон выглядит так:
label my_mod:
"Повествование в adv-режиме."
window hide # Плавное скрытие окна
pause(1) # Секундная пауза, чтобы сокрытие окна успело произойти до смены режима повествования
$ set_mode_nvl() # Переключение на новелльный режим повествования
nvl show dissolve # Плавное появление nvl-окна
"Повествование в nvl-режиме."
nvl hide dissolve # Плавное скрытие nvl-окна
pause(1) # Секундная пауза, чтобы сокрытие окна успело произойти до смены режима повествования
$ set_mode_adv() # Переключение на adv-режим повествования
window show # Плавное появление диалогового окна
"Повествование в adv-режиме."
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Появление персонажа в NVL-режиме
Персонажи могут быть объявлены для использования в NVL-режиме путем создания ещё одного персонажа, но с добавлением параметра kind=nvl
.
Например:
define maks_nvl = Character('Максим', kind=nvl, color="#c8ffc8")
Если этого не сделать, то внутри nvl-режима повествования персонажи без параметра kind=nvl
будут говорить в adv-режиме.
Обратите своё внимание, что можно сделать и по другому — сделать цикл, который будет менять объявление персонажей в зависимости от текущего режима повествования. Именно такой способ и используется в БЛ.
# Оформление текста
Примеры текстовых тегов:
- alpha
Текстовый тег alpha
отображает текст, расположенный между самим тегом и его закрывающим тегом, с указанной непрозрачностью. Непрозрачность должна иметь значение между 0.0 и 1.0, что соответствует полной прозрачности и полной непрозрачности соответственно. Если значение начинается с префикса +
(добавить на) или -
(убавить на), непрозрачность будет изменена на указанное число, а не полностью заменена. Если значение начинается с префикса *
(умножить на), непрозрачность будет умножена на это число.
"{alpha=0.1}Этот текст едва читаем!{/alpha}"
"{alpha=-0.1}Этот текст на 10 процентов прозрачнее, чем текст по умолчанию.{/alpha}"
"{alpha=*0.5}Этот текст наполовину такой же непрозрачный, как и по умолчанию.{/alpha}"
2
3
- b (bold)
Тег жирного шрифта выводит текст, расположенный между самим тегом и его закрывающим тегом, жирным шрифтом.
"Пример {b}текста, выделенного жирным шрифтом{/b}."
- color
Текстовый тег color
отображает текст, расположенный между самим тегом и его закрывающим тегом, в указанном цвете. Цвет должен быть в формате #rgb, #rgba, #rrggbb или #rrggbbaa.
"{color=#f00}Красный{/color}, {color=#00ff00}Зелёный{/color}, {color=#0000ffff}Синий{/color}"
- i (italic)
Тег курсива отображает текст, расположенный между самим тегом и его закрывающим тегом, курсивом.
mt "Добро пожаловать в {i}СОЛ «Совёнок»!{/i}."
- s (strikethrough)
Тег зачеркивания проводит черту через текст, расположенный между тегом и его закрывающим тегом.
mi "Я очень надеюсь, что {s}тебе понравилось{/s}."
- u (underline)
Тег подчеркивания подчеркивает текст, расположенный между самим тегом и его закрывающим тегом.
mi "Рада видеть {u}тебя{/u}!"
- w (wait)
Тег ожидание – самозакрывающийся тег, который ждёт, пока читатель нажмёт на кнопку для продолжения. Если для тега задан аргумент в форме числа,то ожидание автоматически заканчивается, когда заданные секунды проходят.
un "Я{w} очень{w=1.0} рада!"
Полный список текстовых тегов можно найти внутри соответствующей статьи в документации Ren'Py (opens new window).
# Фоны
# Бэкграунды [БГ]
Общий синтаксис для вывода фона: scene <Название фона>
или show <Название фона>
Разница между scene и show
В первом случае команда очищает все слои и показывает изображение, во втором — просто показывает изображение поверх других. Приведём пример:
label my_mod:
show bg ext_square_day # Площадь
show dv smile pioneer2 at left # Слева появляется Алиса
show mi happy pioneer at center # Мику посередине
show un smile pioneer al left # А Лена левее
with dissolve # Пишем в конце всех строчек, а не у каждой, чтобы и БГ, и спрайты появились сразу, а не поочерёдно.
"Некие действия"
scene bg ext_square_day with dissolve
"Показываем площадь, но теперь все спрайты убрались совсем."
"Если уберём фон с помощью `hide`, то позади него ничего не будет."
2
3
4
5
6
7
8
9
10
Это был пример с использованием scene
для показа изображения. Фона, в нашем случае.
label my_mod_2:
show bg ext_square_day # Площадь
show dv smile pioneer2 at left # Слева появляется Алиса
show mi happy pioneer at center # Мику посередине
show un smile pioneer al left # А Лена левее
with dissolve # Пишем в конце всех строчек, а не у каждой, чтобы и БГ, и спрайты появились сразу, а не поочерёдно.
"Некие действия"
show bg ext_square_night with dissolve
"Показываем ночную площадь."
"Спрайты никуда не исчезают, остаются поверх фона, который меняется с дневного на ночной."
2
3
4
5
6
7
8
9
10
А здесь была использована команда show
, которая лишь сменила фон на другой, не затрагивая другие изображения. Почему в нашем случае оно сменило только фон, а не показало изображение поверх всех, смотрите ниже.
TIP
В данном случае, из-за того, что у фона имеется отступ после слова bg
, слово bg
сработало как "тэг" и сменился только фон, а не показался новый поверх спрайтов (А если бы изображение было без тэга и показалось поверх всего, то если бы мы его убрали про помощи hide
, мы бы снова увидели нашу дневную площадь и спрайты девушек). Более подробно об этом рассказано чуть ниже.
Например:
scene bg bus_stop # Покажет нам автобусную остановку из времени Семена
scene bg int_bus # Внутри автобуса, привезшего нас в "Совенок"
scene bg ext_bus_night # Снаружи этого же автобуса, но уже ночью
2
3
Фоны из игры представлены в таблице по ссылке: Ресурсы игры - Изображения - Фоны.
# Иллюстрации [ЦГ]
Общий синтаксис для вывода иллюстраций: scene <Название арта>
или show <Название арта>
Например:
scene cg d3_dv_scene_1 # Покажет арт с Алисой и Семёном на сцене, ночью.
scene cg d3_ussr_catched # Покажет лежащую на траве Ульянку.
scene cg d1_sl_dinner_0 # Славя и Семён ночью в столовой.
2
3
Все иллюстрации из игры представлены в таблице по ссылке: Ресурсы игры - Изображения - CG.
# Спрайты
Вызывается спрайт с помощью: show <Имя спрайта>
Обычно спрайты состоят из слов, разделённых пробелом: <имя персонажа> <эмоция> <одежда>
TIP
В оригинальной игре имя персонажа совпадает с ID говорящего из предыдущего раздела этого руководства
Например:
show dv angry pioneer # Злая Алиса
show un cry sport # Плачущая Лена в спортивной форме
2
Все спрайты из игры представлены в таблице по ссылке: Ресурсы игры - Изображения - Спрайты.
WARNING
Если персонаж уже на экране, то повторное использование show
будет менять эмоцию и/или одежду, если при повторном использовании у персонажа имеется "тэг".
Скажем, в команде show un cry sport
— un
выступает в качестве "тэга" персонажа, поэтому при смене одежды/эмоции не нужно будет убирать предыдущую картинку.
Точно также тэги работают и с изображениями по типу БГ, ЦГ, и прочих.
Для того, чтобы убрать персонажа, воспользуйтесь: hide <Имя персонажа>
TIP
Если вы хотите вслед за этим сменить декорации, то прописывать hide для каждого персонажа не обязательно, команда scene сама их уберет.
# Действия с изображениями
# Позиционирование
При простом использовании show <Спрайт>
он будет появляться просто по центру, это можно исправить, добавив в конец at <Позиция>
: show <Спрайт> at <Позиция>
.
Всего в игре 7 позиций где может находиться спрайт:
fleft
left
cleft
center
cright
right
fright
На скриншоте выше были использованы следующие команды:
scene bg ext_bus_night
show dv angry pioneer2 at left
show un smile pioneer at right
show mi cry_smile pioneer at cleft
show sl serious pioneer at cright
show mt rage panama pioneer at center
2
3
4
5
6
7
TIP
Также, если не хотите использовать стандартные расположения спрайтов, можно сделать свои собственные! Для этого необходимо показать спрайт, а затем прописать его расположение по x и y координатам. Для этого используем команду center
, куда вписываем кортеж float
чисел. Первое число — x координата, вторая — y координата.
label mod_start:
show bg ext_square_day with dissolve
show sl smile pioneer: # Славя стоит левее.
center(0.4, 0.5)
show dv normal pioneer: # Алиса стоит правее.
center(0.6, 0.5)
2
3
4
5
6
Обращаем внимание, что позиционирование идёт по center
, а не по align
или pos
.
Так же можно показать персонажа ближе / дальше. Для этого можно воспользоваться атрибутом close
/ far
.
На скриншоте выше как раз были использованы эти атрибуты. Команды:
scene bg ext_bus_night
show dv angry pioneer2 far at left
show un smile pioneer far at right
show mi cry_smile pioneer at cleft
show sl serious pioneer at cright
show mt rage panama pioneer close at center
2
3
4
5
6
7
# Анимации появления
Мы можем показать спрайты, bg и cg с некоторым замедлением, плавно.
- Плавность
scene <Название> with <Атрибут>
Атрибутов для плавности 6, они отличаются лишь своей скоростью:
dspr
- 0,2 сек - Самый быстрый, на практике не особо заметен. Оптимален для смены эмоций спрайтов.dissolve_fast
- 0.5 сек.dissolve
- также 0.5 сек. Оптимален для смены BG/CG.dissolve2
- 2 сек - хороший вариант для длинных переходов между локациями лагеряhell_dissolve
- 50 секунд - на практике не особо применим, но вдруг пригодится.dissolve_long
- 100 секунд.
Также можно группировать несколько объектов для одновременного начала эффекта:
scene bg ext_bus_night
show sl smile pioner far
with dissolve2
2
3
В приведенном примере мы попадем в ночной автобус, и перед нами предстанет улыбающаяся Славя. Все это с задержкой в 2 секунды.
TIP
Если все вышеприведённые примеры Вас не устраивают, можно добавить свой атрибут плавности. Для этого, пропишите его в блоке init.
Например,
init:
$ trisekundi = Dissolve(3.0)
label my_mod:
scene bg ext_bus_night
show sl smile pioner far
with trisekundi
2
3
4
5
6
7
- Моргание
Я более чем уверен, что вы видели эффект того, как иногда ГГ моргает или вовсе закрывает глаза. Мы можем реализовать подобную возможность!
show blink
- Закрыть глазаshow unblink
- Открыть глазаshow blinking
- Моргание
Будьте осторожны
blink и unblink это разные эффекты, они не могут отменить друг друга.
Пример:
show blink
<Ваши события>
hide blink
show unblink
2
3
4
TIP
Так же к эффектам моргания можно применить атрибут плавности.
# Добавление своих изображений
Вполне может быть, что по сюжету Вашего мода, может не хватить имеющихся БГ, ЦГ и спрайтов. В таком случае, мы добавим свои.
Для начала нам надо объявить изображение в блоке init
. Делается это, с помощью объявления переменной image
. Например, если есть изображение city.jpg
, и оно находится в папке game/mods/my_mod/city.jpg
, то объявить его можно вот так:
init:
image gorod = "mods/my_mod/city.jpg"
2
И использовать его:
init:
image gorod = "mods/my_mod/city.jpg"
label my_mod:
scene gorod with dissolve
2
3
4
5
Тэги к изображениям
Настоятельно рекомендую использовать тэги. В приведённом ниже примере слово bg
выступает в виде тэга к изображению.
Если объявить несколько БГ с таким тегом, то при показе следующего он автоматически заменит предыдущий.
init:
image bg city = "mods/my_mod/city.jpg"
2
Более детальную информацию про ATL (opens new window) смотрите в продвинутом руководстве.
# Звуки
Ren'Py поддерживает воспроизведение музыки и звуковых эффектов, используя следующие форматы аудио файлов: Opus
, Ogg Vorbis
, mp3
, wav
.
# Добавление звуков, музыки, эмбиенса
$ <Название аудиофайла> = <Путь к аудиофайлу>
Добавление различных аудио файлов в ваш мод происходит посредством команды, приведённой выше. Приведём пример использования.
init:
$ city_ambience = "mods/sounds/city_ambience.mp3"
label mod_start:
play ambience city_ambience # Проигрываем эмбиенс города на канале `ambience`
2
3
4
5
# Музыка
Для начала проигрывания музыки используется: play music <Название>
, а для остановки - stop music
.
Список музыки из игры представлен в таблице по ссылке: Ресурсы игры - Звуки - Музыка.
# Окружение
play ambience <Название>
stop ambience
Звуки окружения из игры представлены в таблице по ссылке: Ресурсы игры - Звуки - Окружение.
# Прочее
play sound <Название>
Прочие звуки из игры представлены в таблице по ссылке: Ресурсы - Звуки - Прочие звуки.
# Плавный вход/выход музыки
Команды fadein
и fadeout
являются необязательными. fadeout
дает время затухания для текущей проигрываемой музыки в секундах, в то время как fadein
дает время, необходимое для плавного "входа" новой музыки.
Пример:
label my_mod:
play music sabaton_rock fadein 4 # Воспроизведение музыки с "входом" в 4 секунды
'...' # Происходят некие действия по сюжету
stop music fadeout 4 # Остановка музыки с затуханием в 4 секунды
2
3
4
# Зацикливание и разцикливание музыки
Команды loop
и noloop
также являются необязательными. loop
заставляет музыку зацикливаться, в то время как noloop
заставляет ее играть только один раз. Если ни один из них не задан, используется значение канала по умолчанию.
Пример:
label my_mod:
play sound house_crush loop # Зацикливаем звук рушения дома
play music sabaton_rock noloop # Разцикливаем музыку, заставляя её играть только один раз
2
3
# Поочерёдное воспроизведение
Оператор queue
используется для создания очереди аудио файлов. Они будут воспроизведены, когда канал закончит воспроизведение текущего воспроизводимого файла, если таковой имеется.
Команда для кортежа воспроизводимых файлов начинается с ключевого слова queue
, за которым следует имя канала для воспроизведения звука. Он опционально принимает команды fadein
, loop
и noloop
.
Пример:
label my_mod:
queue music ["rock.mp3", "hip_hop.mp3", "jazz.mp3"] # Поочерёдно воспроизводит три аудиофайла через канал 'music'. После окончания первого файла, сразу же начинается следующий.
2
TIP
Также queue
поддерживает параметры loop
и fadein
.
# Видео
Ren'Py предусматривает возможность использования встроенной версии Libav для воспроизведения видеороликов с такими форматами, как: .webm
, .matroska
, .ogg
,.avi
# Полноэкранные видеоролики
Самый простой способ отображения видео в полноэкранном режиме заключается в использовании функции renpy.movie_cutscene
. Она отображает видео в полноэкранном режиме до тех пор, пока оно не закончится, либо пока игрок не щелкнет кнопкой мыши, чтобы прекратить воспроизведение.
Пример использования:
label my_mod:
dv "Сейчас запустится фильм!"
$ renpy.movie_cutscene("Брат.webm")
dv "Фильм закончился."
2
3
4
# Видео, как отображаемые объекты и спрайты
Видеоролик, отображаемый на экране посредством команды Movie
, можно использовать для отображения в любом месте, где Ren'Py может его показать. Например, видео может выводиться как фон экрана меню или в качестве фона.
Отображаемый видеоролик также можно использовать для определения видео спрайта, который представляет собой спрайт, склеенный из двух видео. Первый видеоролик обеспечивает цвет спрайта. Второй, - так называемый, "маска-ролик", - обеспечивает альфа-канал, где белый цвет - полная непрозрачность, а чёрный - полная прозрачность.
TIP
Видео, которые воспроизводятся в отображаемом объекте Movie
, зацикливаются автоматически.
Movie
принимает два параметра:
play
— строка, содержащая имя воспроизводимого видеофайла. Параметр всегда должен быть задан.mask
— строка, содержащая наименование видеофайла для использования в качестве альфа-маски. Она должна быть того же размера, продолжительности и частоты кадров, что и видеофайл, заданный вplay
.
Вот пример определения видео спрайта:
init:
image brat movie = Movie(play="brat.webm", mask="brat_mask.webm")
2
Видео спрайт можно показать с помощью оператора show
, который автоматически запускает воспроизведение видео. Он будет автоматически остановлен при скрытии отображаемого объекта.
label my_mod:
show brat movie
"Данный видеоролик показан как спрайт."
hide brat
"Ролик убран."
2
3
4
5
Видеоролик, прописанный через Movie
также можно использовать как часть экрана, при условии, что он создан во время фазы инициализации (init-блок) (например, как часть оператора image).
Приведём пример:
init:
image main_menu = Movie(play="main_menu.ogv")
screen main_menu:
add "main_menu"
textbutton "Start" action Start() xalign 0.5 yalign 0.5
2
3
4
5
6
TIP
Экраны можно прописывать и вне init-блока.
TIP
Несколько отображаемых видеороликов, прописанных через Movie
, или спрайтов могут отображаться на экране одновременно с учетом производительности системы и при условии, что все они имеют одинаковую частоту кадров. Поведение Ren'Py при отображении видеороликов с разной частотой кадров не определено, но, скорее всего, будет включать значительную потерю кадров.