Галерея изображений, музыкальная комната и повтор действий (Image Gallery, Music Room, and Replay Actions)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Галерея изображений (Image Gallery)[править | править код]

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

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

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


Создание галереи изображений происходит в четыре этапа:

  1. Создайте представителя класса Gallery.
  2. Добавьте кнопки и изображения в эту галерею вместе с условиями, определяющими, разблокированы ли кнопки и связанные с ними изображения. Этот процесс также состоит из нескольких этапов:
    1. Объявите новую кнопку, вызвав Gallery.button().
    2. При необходимости добавьте кнопке одно или несколько условий для разблокировки, вызвав Gallery.unlock() или Gallery.condition().
    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("title")
    g.image("title")

    # Кнопка, содержащая изображение, которое автоматически разблокируется.
    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")

    # Переход используется при переключении изображений.
    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)
        add g.make_button("title", "title.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
Переход, используемый при смене изображений.


locked_button
Отображаемый объект, используемый make_button по умолчанию для заблокированной кнопки.


hover_border
Граница при наведении, используемая make_button по умолчанию.


idle_border
Неактивная рамка, используемая make_button по умолчанию.


unlocked_advance
Если принимает значение True, галерея будет перемещаться только через разблокированные изображения.


navigation
Если принимает значение True, галерея будет отображать кнопки навигации и слайд-шоу поверх изображений.
Чтобы настроить внешний вид навигации, вы можете переопределить экран gallery_navigation. Экран по умолчанию определен в common/00gallery.rpy.


span_buttons
Если принимает значение True, галерея будет перемещаться между кнопками.


slideshow_delay
Время перехода галереи между изображениями в режиме слайд-шоу.


Action(name)
Действие, которое отображает изображения, связанные с заданным названием кнопки.


Next(unlocked=False)
Переход к следующему изображению в галерее.
unlocked
Если принимает значение True, учитывает только разблокированные изображения.


Previous(unlocked=False)
Переход к предыдущему изображению в галерее.
unlocked
Если принимает значение True, учитывает только разблокированные изображения.


Return(self)
Останавливает отображение изображений галереи.


ToggleSlideshow(self)
Переключает режим слайд-шоу.


allprior(self)
Условие, которое выполняется, если все предыдущие изображения, связанные с текущей кнопкой, были разблокированы.


button(name)
Создает новую кнопку с названием name.
name
Название создаваемой кнопки.


condition(expression)
Условие, которое выполняется, когда выражение принимает значение True.
expression
Строка, задающая выражение на языке Python.


display(*displayables)
Добавляет новое изображение к текущей кнопке, где изображение состоит из одного или нескольких отображаемых элементов.


get_fraction(name, format=u'{seen}/{total}')
Возвращает текстовую строку, содержащую количество разблокированных изображений и общее количество изображений в кнопке с названием name.
format
Строка формата Python, используемая для форматирования чисел. Имеет три значения, которые могут использоваться в качестве заменителей в:
{seen}
Количество изображений, которые были замечены.
{total}
Общее количество изображений в кнопке.
{locked}
Количество изображений, которые всё ещё заблокированы.


image(*displayables)
Добавляет новое изображение к текущей кнопке, где изображение состоит из одного или нескольких отображаемых элементов.


make_button(name, unlocked, locked=None, hover_border=None, idle_border=None, style=None, **properties)
Создаёт кнопку, которая показывает изображения, связанные с заданным названием кнопки.
name
Название создаваемой кнопки.
unlocked
Отображаемый объект, который отображается, когда кнопка разблокирована.
locked
Отображаемый объект, который отображается, когда кнопка заблокирована. Если принимает значение None, то вместо неё используется поле locked_button объекта галереи.
hover_border
Отображаемый объект, который отображается поверх разблокированной кнопки, когда на неё наведён курсор. Если принимает значение None, то используется поле hover_border объекта галереи.
idle_border
Отображаемый объект, который отображается поверх разблокированной кнопки, когда на неё не наведён курсор. Если принимает значение None, то используется поле idle_border объекта галереи.
style
Стиль, который наследует кнопка. Когда принимает значение None, по умолчанию используется «пустой» стиль, чтобы не наследовать границы и так далее.
Дополнительные именованные аргументы становятся свойствами стиля создаваемого объекта кнопки.


transform(*transforms)
Применяет преобразования к последнему зарегистрированному изображению. Должен вызываться с тем же количеством преобразований, что и отображаемое изображение. Преобразования применяются к соответствующим отображаемым объектам.
Если преобразование принимает значение None, используется преобразование по умолчанию.


unlock(*images)
Условие, которое принимает в качестве аргумента одно или несколько имен изображений и выполняется, когда игрок видит все названные изображения. Названия изображений должны быть заданы в виде строк.


unlock_image(*images)
Вспомогательный метод, который эквивалентен вызову image и unlock с теми же параметрами. Позволяет показать изображение, если оно уже было увидено ранее.
images должны быть заданы в виде строк, задающих названия изображений.

Музыкальная Комната (Music Room)[править | править код]

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

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

1. Создайте представителя класса MusicRoom. В конструкторе MusicRoom задаются параметры, определяющие канал, на котором воспроизводится музыка, и то, сколько времени требуется для затухания и возврата музыки.
2. Добавьте музыкальные файлы к представителю.
3. Создайте экран, который использует представителя MusicRoom для создания действий для кнопок, графических кнопок и активных зон. Этими действиями могут выбрать трек, следующий или предыдущий трек, или остановить и запустить музыку.
Обратите внимание, что используемые действия являются элементами представителя 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=u'music', fadeout=0.0, fadein=0.0, loop=True, single_track=False, shuffle=False, stop_action=None)
Музыкальная комната, содержащая ряд песен, которые могут быть разблокированы пользователем, и действия, которые могут воспроизводить записи из списка по порядку.
channel
Канал, на котором будет работать эта музыкальная комната.
fadeout
Количество секунд, необходимое для затухания текущей мелодии при смене трека.
fadein
Количество секунд, необходимое для усиления звука новой мелодии при смене трека.
loop
Определяет, будет ли воспроизведение зацикливаться или останавливаться, когда оно достигает конца списка воспроизведения.
single_track
Если принимает значение True, будет воспроизводиться только один трек. Если loop принимает значение True, этот трек будет зациклен. Иначе воспроизведение остановится после завершения дорожки.
shuffle
Если принимает значение True, дорожки перемешиваются и воспроизводятся в перемешанном порядке. Если принимает значение False, треки воспроизводятся в порядке их добавления в MusicRoom.
stop_action
Действие для запуска, когда музыка остановилась.


Next(self)
Действие, которое приводит к воспроизведению следующего разблокированного трека в списке воспроизведения.


Play(filename=None)
Действие приводит к началу воспроизведения музыкальной комнаты. Если задан filename, то он начинает воспроизводиться. Иначе воспроизведение текущего музыкального файла запускается заново (если он разблокирован) или начинает воспроизводиться первый файл.
Если задан filename, кнопки с этим действием будут неактивны при блокировке filename и будут отображаться как выбранные во время воспроизведения filename.


Previous(self)
Действие, которое воспроизводит предыдущий разблокированный файл в списке воспроизведения.


RandomPlay(self)
Действие, которое воспроизводит случайно выбранную разблокированную музыкальную дорожку.


SetLoop(value)
Действие, которое задаёт значение свойства loop.


SetShuffle(value)
Действие, которое задаёт значение свойства shuffle.


SetSingleTrack(value)
Действие, которое задаёт значение свойства single_track.


Stop(self)
Действие, которое останавливает музыку.


ToggleLoop(self)
Действие, которое переключает значение свойства loop.


TogglePlay(self)
Если в данный момент музыка не воспроизводится, это действие начинает воспроизведение первой разблокированной дорожки. Иначе останавливает воспроизведение музыки.
Эта кнопка выбирается при воспроизведении любой музыки.


ToggleShuffle(self)
Действие, которое переключает значение свойства shuffle.


ToggleSingleTrack(self)
Действие, которое переключает значение свойства single_track.


add(filename, always_unlocked=False, action=None)
Добавляет filename музыкального файла в музыкальную комнату. Данные разблокированные файлы будут воспроизводиться в том порядке, в каком они добавлены.
always_unlocked
Если принимает значение True, музыкальный файл будет всегда разблокирован. Это позволяет файлу отображаться в музыкальной комнате до того, как он будет воспроизведён в игре.
action
Действие или список действий. Вызываются при воспроизведении этого файла.
Например, эти действия используются для изменения экрана или фона, описания воспроизводимого файла.


is_unlocked(filename)
Возвращает значение True, если имя файла было разблокировано (или разблокирован всегда), и False, если файл всё ещё заблокирован.

Режим повторного воспроизведения сцен (Replay)[править | править код]

Ren'Py также включает возможность повторного воспроизведения сцены из главного или игрового меню. Это можно использовать для создания "галереи сцен" или галереи памяти, которая позволяет игроку повторять важные сцены. После завершения сцены Ren'Py возвращается к экрану меню, который запустил воспроизведение.

Повторное воспроизведение сцены также возможно с помощью действия Start(). Различие между двумя режимами:

  • Повторное воспроизведение можно запустить с любого экрана, в то время как Start можно использовать только в главном меню или экранах, отображаемых в главном меню.
  • Когда воспроизведение заканчивается, управление возвращается в место, в которой оно было запущено. Это место может быть внутри главного меню, игрового меню. Если при запуске воспроизведения игра продолжается, состояние игры сохраняется.
  • В режиме воспроизведения сохранение отключено.
  • В режиме воспроизведения вызов renpy.end_replay() завершит воспроизведение. В обычном режиме end_replay ничего не делает.


Чтобы воспользоваться преимуществами режима повторного воспроизведения, сцена должна начинаться с метки и заканчиваться вызовом renpy.end_replay(). Сцена не должна делать никаких предположений относительно состояния слоёв или переменных, которые могут сильно отличаться в обычном режиме и режиме повторного воспроизведения. Когда начинается воспроизведение, метка вызывается с чёрным экраном.

Например:

     "И, наконец, я встретил самого волшебника."

label meaning_of_life:

    scene

    "Волшебник" "В чём смысл жизни, говоришь?"

    "Волшебник" "Я думал об этом долго и упорно. Долгое время я размышлял именно об этом."

    "Волшебник" "И я скажу - ответ - смысл самой жизни..."

    "Волшебник" "Cорок три."

    $ renpy.end_replay()

    "Волшебник" "В любом случае, как-то так."

При таком определении сцены воспроизведение может быть вызвано с помощью действия Replay:

textbutton "Смысл жизни" action Replay("meaning_of_life")


В режиме повторного воспроизведения используется одна переменная хранилища:

_in_replay
В режиме повторного воспроизведения он отправляется метке, с которой был запущен режим воспроизведения. Вне режима повторного воспроизведения принимает значение None.


Кроме того, config.enter_replay_transition и config.exit_replay_transition используются при входе и выходе из режима повторного воспроизведения. config.replay_scope добавляет переменные в очищенное хранилище при входе в повторного воспроизведение и по умолчанию устанавливает _game_menu_screen, чтобы при щелчке правой кнопкой мыши в воспроизведении по умолчанию отображался экран настроек.


В режиме повторного воспроизведения используются следующие переменные и действия:

EndReplay(confirm=True)
Завершает текущее воспроизведение.
confirm
Если принимает значение True, запрашивает у пользователя подтверждение перед завершением воспроизведения.


Replay(label, scope={}, locked=None)
Действие, которое запускает label как повтор.
scope
Словарь, сопоставляющий имя переменной со значением. Эти переменные устанавливаются при входе в повторное воспроизведение.
locked
Если принимает значение True, то это повторное воспроизведение заблокировано. Если принимает значение False, оно разблокировано. Если принимает значение None, воспроизведение блокируется, если метку не видели ни в одном прохождении.


renpy.call_replay(label, scope={})
Вызывает метку как память.
Именованные аргументы используются для установки начальных значений переменных в контексте памяти.


renpy.end_replay()
Если мы находимся в повторном воспроизведении, немедленно завершит его. Иначе ничего не делает.

Источник[править | править код]


На главную страницу Официальная документация движка Вернуться к началу статьи