The Ren'Py Jam is a game jam running from September 15th to September 30th, 2018, asking you to make a game that shows off Ren'Py.

This page is out of date

You've reached a page on the Ren'Py wiki. Due to massive spam, the wiki hasn't been updated in over 5 years, and much of the information here is very out of date. We've kept it because some of it is of historic interest, but all the information relevant to modern versions of Ren'Py has been moved elsewhere.

Some places to look are:

Please do not create new links to this page.


Галерея Изображений и Музыкальная Комната

Данная статья является переводом документации Image Gallery and Music Room Actions.

Галерея изображений (ГИ)

ГИ - это экран, который позволяет игроку разблокировать изображения и затем просматривать эти изображения. Экран имеет одну или несколько связанных с ним кнопок, и каждая кнопка имеет одно или несколько связанных с ней изображений. Кнопки и изображения также имеют условия, которые определяют разблокированы они или нет.

ГИ управляются экземплярами класса Gallery. Каждый экземпляр класса может быть использован для нескольких экранов ГИ.

ГИ имеет одну или более кнопок, связанных с ней, кнопка имеет одно или более связанных с ней изображений, и каждое изображение имеет одну или более картинок (displayable), связанных с ним. Для кнопок и изображений могут быть назначены условия. Кнопка считается разблокированной, когда все назначенные для нее условия выполнены, и разблокировано хотя бы одно изображение, связанное с ней. Изображение считается разблокированным, когда все назначенные для него условия выполнены.

Создание ГИ происходит в четыре этапа.

1. Создание экземпляра класса Gallery.

2. Добавление кнопок и изображений в галерею, равно как и условий, определяющих будут ли кнопки и связанные с ними изображения считаться разблокированными. Этот процесс также состоит из нескольких этапов.

1. Объявление новой кнопки, путем вызова Gallery.button().
2. По желанию, назначение кнопке одного или более условий для разблокирования, путем вызова Gallery.unlock(), Gallery.condition(), или Gallery.allprior().
3. Объявление картинки, путем вызова Gallery.image() с одной или несколькими картинками в качестве аргумента. Или вызова более удобного метода Gallery.unlock_image().
4. По желанию, вызов Gallery.transform() для установки трансформаций, применяемых к каждой картинке.
5. По желанию, добавление одного или более условий, при выполнении которых изображение будет считаться разблокированным, путем вызова Gallery.unlock(),Gallery.condition(), или Gallery.allprior().
Дополнительные изображения могут быть добавлены к кнопке путем повторения этапов 3-5, а дополнительные кнопки – путем повторения всех пяти этапов.

3. Создание экрана галереи. Экран должен иметь фоновую картинку и какие-нибудь кнопки навигации, которые позволят пользователю посмотреть другие галереи или вернуться в главное либо дополнительное меню. 4. Добавление в главное либо дополнительное меню кода для показа экрана галереи на дисплее.

Далее пример первых трех этапов:

init python:

    # Этап 1. Создаем объект галереи.
    g = Gallery()

    # Этап 2. Добавляем в галерею кнопки и изображения.

    # Кнопка, содержащая картинку, которая автоматически считается
    # разблокированной.
    g.button("dawn")
    g.image("dawn1")
    g.unlock("dawn1")

    # Эта кнопка имеет несколько связанных с ней картинок. Мы используем
    # unlock_image
    # так что нам не надо использовать оба .image и .unlock. Также, установим
    # трансформацию для первого изображения.
    g.button("dark")
    g.unlock_image("bigbeach1")
    g.transform(slowpan)
    g.unlock_image("beach1 mary")
    g.unlock_image("beach2")
    g.unlock_image("beach3")

    # Для следующих кнопок установлены условия, позволяющие
    # запрограммировать какое изображение считать разблокированным.
    g.button("end1")
    g.condition("persistent.unlock_1")
    g.image("transfer")
    g.image("moonpic")
    g.image("girlpic")
    g.image("nogirlpic")
    g.image("bad_ending")

    g.button("end2")
    g.condition("persistent.unlock_2")
    g.image("library")
    g.image("beach1 nomoon")
    g.image("bad_ending")

    # Для последних изображений в этих кнопках установлено условие,
    # так что они будут считаться разблокированными, только если пользователь
    # получит обе концовки.
    g.button("end3")
    g.condition("persistent.unlock_3")
    g.image("littlemary2")
    g.image("littlemary")
    g.image("good_ending")
    g.condition("persistent.unlock_3 and persistent.unlock_4")

    g.button("end4")
    g.condition("persistent.unlock_4")
    g.image("hospital1")
    g.image("hospital2")
    g.image("hospital3")
    g.image("heaven")
    g.image("white")
    g.image("good_ending")
    g.condition("persistent.unlock_3 and persistent.unlock_4")

    # Последние две кнопки содержат изображения, показывающие несколько
    # картинок одновременно.
    # Это можно использовать для показа картинки персонажа поверх фоновой
    # картинки.
    g.button("dawn mary")
    g.unlock_image("dawn1", "mary dawn wistful")
    g.unlock_image("dawn1", "mary dawn smiling")
    g.unlock_image("dawn1", "mary dawn vhappy")

    g.button("dark mary")
    g.unlock_image("beach2", "mary dark wistful")
    g.unlock_image("beach2", "mary dark smiling")
    g.unlock_image("beach2", "mary dark vhappy")

    # Установим перемещение (transition), которое будет использоваться при
    # смене изображений.
    g.transition = dissolve

# Этап 3. Создаем экран галереи.
screen gallery:

    # Убедимся, что он заменит собой главное меню.
    tag menu

    # Добавим фоновую картинку.
    add "beach2"

    # Сетка, состоящая из кнопок.
    grid 3 3:

        xfill True
        yfill True

        # Вызываем make_button для показа каждой кнопки.
        add g.make_button("dark", "gal-dark.png", xalign=0.5, yalign=0.5)
        add g.make_button("dawn", "gal-dawn.png", xalign=0.5, yalign=0.5)
        add g.make_button("end1", "gal-end1.png", xalign=0.5, yalign=0.5)

        add g.make_button("end2", "gal-end2.png", xalign=0.5, yalign=0.5)
        add g.make_button("end3", "gal-end3.png", xalign=0.5, yalign=0.5)
        add g.make_button("end4", "gal-end4.png", xalign=0.5, yalign=0.5)

        add g.make_button("dark mary", "gal-dark_mary.png", xalign=0.5, yalign=0.5)
        add g.make_button("dawn mary", "gal-dawn_mary.png", xalign=0.5, yalign=0.5)

        # Кнопка, отвечающая за возврат в главное меню. Также, она может
        # перенаправлять на другой экран галереи.
        textbutton "Return" action Return() xalign 0.5 yalign 0.5

Этап 4 варьируется в зависимости от того, как структурирована ваша игра, один из вариантов – добавить следующую строку:

textbutton "Gallery" action ShowMenu("gallery")

в код экрана главного меню.

class Gallery(self)

Этот класс предоставляет возможность создавать ГИ, обслуживая блокировку изображений, предоставляя действие, которое может показать одно или более изображений, и предоставляя метод, который создает кнопки, использующие это действие.
transition
Перемещение (transition), которое используется при смене изображений.
locked_button
Картинка, используемая make_button по умолчанию для заблокированных кнопок.
hover_border
Активная рамка, которую по умолчанию использует make_button.
idle_border
Неактивная рамка, которую по умолчанию использует make_button.
Action(name)
Действие, которое показывает изображения, связанные с указанной кнопкой.
allprior(self)
Условие, которое считается выполненным, если были разблокированы все предыдущие изображения, связанные с данной кнопкой.
button(name)
Создает новую кнопку с названием name.
name
Название создаваемой кнопки.
condition(expression)
Условие, которое считается выполненным, если выражение (expression) имеет значение Истина (True).
expression
Строка – выражение на языке python.
display(*displayables)
Добавляет в текущую кнопку новое изображение, содержащее одну или более картинку (displayables).
image(*displayables)
Добавляет в текущую кнопку новое изображение, содержащее одну или более картинку (displayables).
make_button(name, unlocked, locked=None, hover_border=None, idle_border=None, **properties)
Создает кнопку, которая показывает изображения, связанные с данным названием кнопки.
name
Название создаваемой кнопки.
unlocked
Картинка, которая отображается, когда кнопка разблокирована.
locked
Картинка, которая отображается, когда кнопка заблокирована. Если не задано, то вместо нее используется поле locked_button объекта галереи.
hover_border
Картинка, которая отображается поверх разблокированной кнопки, когда на нее наведен курсор. Если не задано, то используется поле hover_border объекта галереи.
idle_border
Картинка, которая отображается поверх разблокированной кнопки, когда на нее не наведен курсор. Если не задано, то используется поле idle_border объекта галереи.
Дополнительные ключевые аргументы становятся параметрами стиля создаваемого объекта кнопки.
transform(*transforms)
Применяет трансформации (transforms) к последнему зарегистрированному изображению. Должен вызываться с тем же количеством трансформаций, сколько картинок связано с изображением. Трансформации применяются к соответствующим картинкам.
Если трансформация не задана, то используется трансформация по умолчанию.
unlock(*images)
Условие, которое содержит одно или более названия изображений и считается выполненным, если игрок видел все названные изображения. Названия изображений должны быть заданы в строковом формате (as strings).
unlock_image(*images)
Удобный метод, который является эквивалентом вызова image и unlock с одинаковыми параметрами. Он позволяет показать изображение, если оно уже было увидено ранее.
(images) должно быть определено в строковом формате, задавая названия изображений.

Музыкальная Комната (МК)

МК – это экран, который позволяет пользователю выбрать и воспроизвести музыкальные треки из игры. Изначально, эти треки могут быть заблокированы, когда игрок впервые начинает прохождение игры, и будут разблокированы по мере того, как пользователь прослушивает музыку в процессе игры.

МК управляется экземпляром класса MusicRoom. В игре может быть больше одного экземпляра MusicRoom, что позволяет сделать несколько МК. Создание МК состоит из следующих шагов:

1. Создание экземпляра MusicRoom. В конструкторе MusicRoom задаются параметры, определяющие канал, в котором будет проигрываться музыка, и длительность усиления / затухания музыки.
2. Добавление музыкальных файлов в этот экземпляр.
3. Создание экрана, который использует этот экземпляр MusicRoom для создания действий (action) для кнопок (button), графических кнопок (imagebutton) и активных зон (hotspot). Этими действиями могут быть выбор трека, следующий / предыдущий трек, или остановка и воспроизведение музыки.
Заметим, что используемые действия являются элементами экземпляра MusicRoom, так что если экземпляр MusicRoom был назван mr, то использование действия «воспроизвести» будет выглядеть так – mr.Play(“track1.ogg”).
4. Добавим экран МК в главное или дополнительное меню.

Вот пример первых трех шагов:

init python:

    # Шаг 1. Создаем экземпляр MusicRoom.
    mr = MusicRoom(fadeout=1.0)

    # Шаг 2. Добавляем файлы музыки.
    mr.add("track1.ogg", always_unlocked=True)
    mr.add("track2.ogg")
    mr.add("track3.ogg")


# Шаг 3. Создаем экран музыкальной комнаты.
screen music_room:

    tag menu

    frame:
        has vbox

        # Кнопки для воспроизведения каждого трека.
        textbutton "Track 1" action mr.Play("track1.ogg")
        textbutton "Track 2" action mr.Play("track2.ogg")
        textbutton "Track 3" action mr.Play("track3.ogg")

        null height 20

        # Кнопки, позволяющие переключать треки.
        textbutton "Next" action mr.Next()
        textbutton "Previous" action mr.Previous()

        null height 20

        # Кнопка, позволяющая пользователю покинуть МК.
        textbutton "Main Menu" action ShowMenu("main_menu")

    # Начнем воспроизводить музыку при входе в МК.
    on "replace" action mr.Play()

    # При выходе из МК вернем музыку главного меню.
    on "replaced" action Play("music", "track1.ogg")

Шаг 4 будет варьироваться в зависимости от того как структурирована ваша игра, один из вариантов – это добавление следующей строки кода

textbutton "Music Room" action ShowMenu("music_room")

в экран главного меню.

Используя функцию Preferences(), а именно Preferences("music volume"), можно добавить на экран МК ползунок громкости.

class MusicRoom(channel='music', fadeout=0.0, fadein=0.0)

Музыкальная комната, содержащая наборы песен, которые могут быть разблокированы пользователем, и действия для их последовательного воспроизведения.
channel
Канал, который будет использовать МК.
fadeout
Время (в секундах), в течение которого будет происходить затухание текущей мелодии при смене трека.
fadein
Время (в секундах), в течение которого будет происходить усиление звука новой мелодии при смене трека.
Next(self)
Действие МК, которое приводит к воспроизведению следующего разблокированного трека в списке воспроизведения.
Play(filename=None)
Воспроизведение музыки. Если задано название файла (filename), то начинается его воспроизведение. В противном случае, воспроизведение текущего музыкального файла начинается заново (если он разблокирован), или начинается воспроизведение первого файла.
Если задано название файла (filename), то кнопки, содержащие данное действие, будут неактивны, если данный файл заблокирован, и будут отображаться как выбранные во время воспроизведения файла.
Previous(self)
Действие, которое воспроизводит предыдущий разблокированный файл в списке воспроизведения.
Stop(self)
Останавливает музыку.
add(filename, always_unlocked=False)
Добавляет названия файлов музыки в МК. Данные файлы будут воспроизводиться в том порядке, в каком они добавлены (при условии, что они разблокированы).
always_unlocked
Если значение Истина (True), то файл будет постоянно разблокирован. Это позволяет показать музыкальный файл в МК до того как он был воспроизведен в игре.
is_unlocked(filename)
Возвращает значение Истина (True), если файл был разблокирован (или разблокирован всегда) и Ложь (False), если файл все еще заблокирован.