Галерея изображений, музыкальная комната и действия повтора
Галерея изображений
Галерея изображений — это экран, который позволяет игроку разблокировать изображения, а затем просматривать их. С экраном связана одна или несколько кнопок, и с каждой кнопкой связано одно или несколько изображений. Кнопки и изображения также имеют условия, определяющие, разблокированы ли они.
Галереи изображений управляются экземплярами класса Gallery. Один и тот же экземпляр класса Gallery может использоваться несколькими экранами галерей изображений.
С галереей связана одна или несколько кнопок, с кнопкой связано одно или несколько изображений, и с каждым изображением связано одно или несколько отображаемых объектов (displayables). К кнопкам и изображениям можно привязать условия. Кнопка разблокируется, когда все связанные с ней условия выполнены и хотя бы одно изображение, связанное с этой кнопкой, разблокировано. Изображение разблокируется, когда все связанные с ним условия выполнены.
Создание галереи изображений состоит из следующих четырех шагов.
Создайте экземпляр Gallery.
Добавьте в эту галерею кнопки и изображения, а также условия, которые определяют, разблокированы ли кнопки и изображения, к которым они относятся. Это также многошаговый процесс.
Объявите новую кнопку, вызвав
Gallery.button().По желанию, добавьте к кнопке одно или несколько условий разблокировки, вызвав
Gallery.unlock()илиGallery.condition().Объявите изображение, вызвав
Gallery.image()с одним или несколькими отображаемыми объектами в качестве аргументов. Или вместо этого вызовите удобный методGallery.unlock_image().По желанию, вызовите
Gallery.transform()для привязки трансформаций к отображаемым объектам.По желанию, добавьте одно или несколько условий разблокировки к изображению, вызвав
Gallery.unlock(),Gallery.condition()илиGallery.allprior().
Дополнительные изображения можно добавить к кнопке, повторив шаги 3–5, а дополнительные кнопки можно добавить в галерею, повторив все пять шагов.
Создайте экран галереи изображений. Экран должен отображать фон и содержать навигацию, позволяющую пользователю переключаться на другие галереи изображений или возвращаться в главное или дополнительное меню.
Добавьте способ отображения экрана галереи изображений в главное или дополнительное меню.
Вот пример:
init python:
# Step 1. Create the gallery object.
g = Gallery()
# Step 2. Add buttons and images to the gallery.
# A button with an image that is always unlocked.
g.button("title")
g.image("title")
# A button that contains an image that automatically unlocks.
g.button("dawn")
g.image("dawn1")
g.unlock("dawn1")
# This button has multiple images associated with it. We use unlock_image
# so we don't have to call both .image and .unlock. We also apply a
# transform to the first image.
g.button("dark")
g.unlock_image("bigbeach1")
g.transform(slowpan)
g.unlock_image("beach1 mary")
g.unlock_image("beach2")
g.unlock_image("beach3")
# This button has a condition associated with it, allowing the game
# to choose which images unlock.
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")
# The last image in this button has an condition associated with it,
# so it will only unlock if the user gets both endings.
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")
# The final two buttons contain images that show multiple pictures
# at the same time. This can be used to compose character art onto
# a background.
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")
# The transition used when switching images.
g.transition = dissolve
# Step 3. The gallery screen we use.
screen gallery:
# Ensure this replaces the main menu.
tag menu
# The background.
add "beach2"
# A grid of buttons.
grid 3 3:
xfill True
yfill True
# Call make_button to show a particular 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)
# The screen is responsible for returning to the main menu. It could also
# navigate to other gallery screens.
textbutton "Return" action Return() xalign 0.5 yalign 0.5
Шаг 4 будет варьироваться в зависимости от структуры вашей игры, но один из способов сделать это — добавить следующую строку:
textbutton "Gallery" action ShowMenu("gallery")
на экран главного меню.
- class Gallery
Этот класс поддерживает создание галереи изображений, управляя блокировкой изображений, предоставляя действие, которое может показывать одно или несколько изображений, и метод, создающий кнопки, использующие это действие.
- enter_transition
Переход, используемый при отображении первого изображения, связанного с кнопкой галереи.
- intra_transition
Переход, используемый при отображении изображений, связанных с кнопками галереи, кроме первого.
- exit_transition
Переход, используемый при возвращении с последнего изображения, связанного с кнопкой галереи, на экран галереи.
- transition
Используется вместо enter_transition, intra_transition или exit_transition, если один или несколько из них не установлены.
- locked_button
Отображаемый объект по умолчанию, используемый make_button для заблокированной кнопки.
- hover_border
Рамка при наведении по умолчанию, используемая make_button.
- idle_border
Рамка в состоянии покоя по умолчанию, используемая make_button.
- unlocked_advance
Если true, галерея будет переключаться только между разблокированными изображениями.
Если true, галерея будет отображать кнопки навигации и слайд-шоу поверх изображений.
Чтобы настроить внешний вид навигации, вы можете переопределить экран gallery_navigation. Экран по умолчанию определён в renpy/common/00gallery.rpy
- span_buttons
Если true, галерея будет переключаться между кнопками.
- slideshow_delay
Время, через которое галерея будет переключаться между изображениями в режиме слайд-шоу.
- image_screen = "_gallery"
Экран, который используется для показа отдельных изображений в этой галерее. Этому экрану передаются следующие именованные аргументы:
- locked
True, если изображение заблокировано.
- displayables
Список преобразованных отображаемых объектов, которые должны быть показаны пользователю.
- index
Индекс отображаемого изображения, начиная с 1.
- count
Количество изображений, привязанных к текущей кнопке.
- gallery
Объект галереи изображений.
Дополнительные аргументы могут быть переданы путем добавления к ним префикса show_ в вызовах Gallery.image и Gallery.unlock_image.
Экран по умолчанию определён в конце файла renpy/common/00gallery.rpy.
- Action(name)
Действие, которое отображает изображения, связанные с указанным именем кнопки.
- Next(unlocked=False)
Переходит к следующему изображению в галерее.
- unlocked
Если true, учитывает только разблокированные изображения.
- Previous(unlocked=False)
Переходит к предыдущему изображению в галерее.
- unlocked
Если true, учитывает только разблокированные изображения.
- Return()
Прекращает показ изображений галереи.
- ToggleSlideshow()
Переключает режим слайд-шоу.
- allprior()
Условие, которое истинно, если все предыдущие изображения, связанные с текущей кнопкой, были разблокированы.
- button(name)
Создаёт новую кнопку с именем name.
- name
Имя создаваемой кнопки.
- condition(expression)
Условие, которое выполняется, когда выражение оценивается как истинное.
- expression
Строка, содержащая выражение Python.
- get_fraction(name, format='{seen}/{total}')
Возвращает текстовую строку с количеством разблокированных изображений и общим количеством изображений в кнопке с именем name. Если name равно None, возвращает ту же информацию для всех кнопок.
- format
Строка форматирования Python, используемая для форматирования чисел. В неё можно подставить три значения:
- {seen}
Количество просмотренных изображений.
- {total}
Общее количество изображений в кнопке.
- {locked}
Количество изображений, которые всё ещё заблокированы.
- image(*displayables, **properties)
Добавляет новое изображение к текущей кнопке, где изображение состоит из одного или нескольких отображаемых объектов (displayables).
У свойств, начинающихся с show_, этот префикс отбрасывается, и они передаются экрану gallery.image_screen в качестве дополнительных именованных аргументов.
Принимает один именованный аргумент:
- movie
Следует установить в true, если один из отображаемых объектов является видео со звуком. Это приведёт к тому, что видео будет скрыто во время перехода.
- 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, по умолчанию используется стиль "empty", чтобы не наследовать рамки и т.д.
Дополнительные именованные аргументы становятся свойствами стиля созданного объекта кнопки.
- transform(*transforms)
Применяет трансформации к последнему зарегистрированному изображению. Следует вызывать с таким же количеством трансформаций, сколько отображаемых объектов у изображения. Трансформации применяются к соответствующим отображаемым объектам.
Если трансформация равна None, используется трансформация по умолчанию.
- unlock(*images)
Условие, которое принимает одно или несколько имён изображений в качестве аргумента и выполняется, когда все указанные изображения были просмотрены игроком. Имена изображений должны быть строками.
- unlock_image(*images, **properties)
Удобный метод, эквивалентный вызову image и unlock с теми же параметрами. (Именованные аргументы, начинающиеся с
show_, передаются только в image.) Это приведёт к отображению изображения, если оно было просмотрено ранее.Изображения следует указывать в виде строк, содержащих их имена.
Музыкальная комната
Музыкальная комната — это экран, который позволяет пользователю выбирать и воспроизводить музыкальные треки из игры. Эти треки могут быть заблокированы, когда пользователь только начинает играть, и будут разблокированы по мере того, как пользователь слушает музыку во время прохождения игры.
Музыкальная комната управляется экземпляром класса MusicRoom. В одной игре может быть несколько экземпляров MusicRoom, что позволяет иметь несколько музыкальных комнат. Создание музыкальной комнаты состоит из следующих четырех шагов:
Создайте экземпляр MusicRoom. Конструктор MusicRoom принимает параметры для управления каналом, на котором воспроизводится музыка, и временем затухания и возобновления музыки.
Добавьте музыкальные файлы в этот экземпляр.
Создайте экран, который использует экземпляр MusicRoom для создания действий для кнопок, кнопок-изображений или активных областей. Эти действия могут выбирать трек, следующий или предыдущий трек, а также останавливать и запускать музыку.
Обратите внимание, что используемые действия являются членами экземпляра MusicRoom, поэтому если экземпляр MusicRoom называется
mr, тоmr.Play("track1.ogg")— это способ использовать действие воспроизведения.Добавьте экран музыкальной комнаты в главное или дополнительное меню.
Вот пример:
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()
Если мы находимся в режиме реплея, немедленно его завершает. В противном случае, делает ничего.