Галерея изображений, музыкальная комната и действия повтора

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

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

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

  1. Создайте экземпляр MusicRoom. Конструктор MusicRoom принимает параметры для управления каналом, на котором воспроизводится музыка, и временем затухания и возобновления музыки.

  2. Добавьте музыкальные файлы в этот экземпляр.

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

    Обратите внимание, что используемые действия являются членами экземпляра MusicRoom, поэтому если экземпляр MusicRoom называется mr, то mr.Play("track1.ogg") — это способ использовать действие воспроизведения.

  4. Добавьте экран музыкальной комнаты в главное или дополнительное меню.

Вот пример:

init python:

    # Step 1. Create a MusicRoom instance.
    mr = MusicRoom(fadeout=1.0)

    # Step 2. Add music files.
    mr.add("track1.ogg", always_unlocked=True)
    mr.add("track2.ogg")
    mr.add("track3.ogg")


# Step 3. Create the music room screen.
screen music_room:

    tag menu

    frame:
        has vbox

        # The buttons that play each track.
        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

        # Buttons that let us advance tracks.
        textbutton "Next" action mr.Next()
        textbutton "Previous" action mr.Previous()

        null height 20

        # The button that lets the user exit the music room.
        textbutton "Main Menu" action ShowMenu("main_menu")

    # Start the music playing on entry to the music room.
    on "replace" action mr.Play()

    # Restore the main menu music upon leaving.
    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, 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

Действие, которое выполняется при остановке музыки.

Single_track и shuffle конфликтуют друг с другом. Только один из них должен быть true в каждый момент времени. (Действия, которые устанавливают single_track и shuffle, обеспечивают это.)

Next()

Действие, которое заставляет музыкальную комнату воспроизвести следующий разблокированный файл в плейлисте.

Play(filename=None)

Это действие заставляет музыкальную комнату начать воспроизведение. Если указан filename, начинает воспроизводиться этот файл. В противном случае текущий воспроизводимый файл начинается заново (если он разблокирован), или начинает воспроизводиться первый файл.

Если указан filename, кнопки с этим действием будут неактивны, пока filename заблокирован, и будут выбраны, когда filename воспроизводится.

Previous()

Действие, которое заставляет музыкальную комнату воспроизвести предыдущий разблокированный файл в плейлисте.

RandomPlay()

Это действие заставляет музыкальную комнату начать воспроизведение случайно выбранного разблокированного музыкального трека.

SetLoop(value)

Это действие устанавливает значение свойства loop.

SetShuffle(value)

Это действие устанавливает значение свойства shuffle.

SetSingleTrack(value)

Это действие устанавливает значение свойства single_track.

Stop()

Это действие останавливает музыку.

ToggleLoop()

Это действие переключает значение свойства loop.

TogglePause()

Если музыка воспроизводится, ставит на паузу или снимает с паузы музыку.

Эта кнопка выбирается, когда музыка на паузе.

TogglePlay()

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

Эта кнопка выбирается, когда воспроизводится любая музыка.

ToggleShuffle()

Это действие переключает значение свойства shuffle.

ToggleSingleTrack()

Это действие переключает значение свойства single_track.

add(filename, always_unlocked=False, action=None)

Добавляет музыкальный файл filename в эту музыкальную комнату. Музыкальная комната будет воспроизводить разблокированные файлы в том порядке, в котором они были добавлены.

always_unlocked

Если true, музыкальный файл всегда будет разблокирован. Это позволяет файлу появиться в музыкальной комнате до того, как он был воспроизведён в игре.

action

Это действие или список действий. Они вызываются при воспроизведении этого файла.

Например, эти действия используются для изменения экрана, фона или описания в зависимости от воспроизводимого файла.

is_unlocked(filename)

Возвращает true, если filename был разблокирован (или всегда разблокирован), и false, если он всё ещё заблокирован.

Повтор

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

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

  • Повтор можно запустить с любого экрана, в то время как Start можно использовать только в главном меню или на экранах, показанных из главного меню.

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

  • Сохранение отключено в режиме повтора. Перезагрузка, которая требует сохранения, также отключена.

  • В режиме повтора вызов renpy.end_replay() завершит повтор. В обычном режиме end_replay ничего не делает.

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

Например:

    "And finally, I met the wizard himself."

label meaning_of_life:

    scene revelation

    "Mage" "What is the meaning of life, you say?"

    "Mage" "I've thought about it long and hard. A long time, I've
            spent pondering that very thing."

    "Mage" "And I'll say - the answer - the meaning of life
            itself..."

    "Mage" "Is forty-three."

    $ renpy.end_replay()

    "Mage" "Something like that, anyway."

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

textbutton "The meaning of life" action Replay("meaning_of_life")

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

_in_replay

В режиме повтора эта переменная отправляется в метку, с которой начался режим повтора — в ту метку, которая была вызвана, а не ту, из которой произошел вызов. Вне режима повтора эта переменная равна None.

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

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

EndReplay(confirm=True)

Завершает текущий реплей.

confirm

Если true, запрашивает у пользователя подтверждение перед завершением реплея.

Replay(label, scope={}, locked=None)

Действие, которое запускает label как реплей.

scope

Словарь, сопоставляющий имена переменных со значениями. Эти переменные устанавливаются при входе в реплей.

locked

Если true, это действие неактивно и ничего не делает при активации. Если false, оно будет вести себя как обычно. Если None, оно будет заблокировано, если метка не была просмотрена ни в одном прохождении.

renpy.call_replay(label, scope={})

Вызывает метку как "воспоминание" (memory).

Аргумент scope используется для установки начальных значений переменных в контексте "воспоминания".

renpy.end_replay()

Если мы находимся в режиме реплея, немедленно его завершает. В противном случае, делает ничего.