Отображение изображений (Displaying Images)

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

Характерной особенностью визуальной новеллы, придающей её имени форму, является графика. Ren'Py содержит четыре оператора, которые управляют выводом изображений на экран и моделью, определяющей порядок отображения изображений. Это позволяет легко выводить изображения на экран таким образом, чтобы это подходило для использования в визуальных новеллах и других играх с элементами повествования.


Ниже приведено четыре оператора, работающих с изображениями:

  • image – определяет новое изображение.
  • show – отображает изображение на слое.
  • scene – очищает слой и дополнительно отображает изображение на этом слое.
  • hide – удаляет изображение со слоя.


Поскольку резкие изменения изображений могут сбивать пользователя с толку, Ren'Py имеет в своем арсенале оператор with, который позволяет применять эффекты, когда изменяется показанное на экране.

Общие понятия (Concepts)[править | править код]

◇ Изображение[править | править код]

Изображение (англ. image) – это то, что можно отобразить на экране с помощью оператора show. Изображение состоит из имени и отображаемого объекта. Когда изображение появляется на слое, связанный с ним отображаемый объект выводится на этом же слое.

Имя изображения состоит из одного или нескольких имён, разделенных пробелами. Первый элемент имени изображения – тег изображения. Второй и последующий элемент имени изображения – атрибуты изображения.

Например, возьмем изображение с именем mary beach night happy. В нашем случае тегом является "mary", а атрибутами изображения - "beach", "night" и "happy".

Отображаемый объект – это то, что можно отобразить на экране. Наиболее распространенный объект для отображения на экране – неподвижное изображение, которое может быть задано путем указания имени файла изображения в виде последовательности символов. В примере, приведённом выше, мы можем использовать "mary_beach_night_happy.png" в качестве имени файла. В то же время изображение может относиться к любому отображаемому объекту, поддерживаемому Ren'Py, а не только к неподвижным изображениям. Таким образом, операторы, используемые для отображения изображений, также могут применяться для выведения на экран анимации, сплошных цветов и других видов отображаемых объектов.


◇ Слой[править | править код]

Слой (англ. layer) – список отображаемых объектов, которые отображаются на экране. Ren'Py поддерживает несколько слоёв, включая слои, задаваемые пользователем. Порядок слоёв фиксируется внутри разрабатываемой игры (управляется переменной config.layers), а порядок отображаемых объектов внутри слоя контролируется порядком, в котором вызываются операторы scene и show, и свойствами, заданными для этих операторов.


Следующие слои являются частью Ren'Py:

master
Слой по умолчанию, используемый операторами scene, show, и hide. Обычно используется для отображения фона и спрайтов персонажей.
transient
Слой по умолчанию, используемый функциями пользовательского интерфейса. Слой очищается в конце каждого взаимодействия.
screens
Слой используется системой экранов.
overlay
Слой по умолчанию, используемый при вызове функции пользовательского интерфейса из функции наложения. Слой очищается при перезапуске взаимодействия.


Дополнительные слои можно определить, обновив config.layers и другие различные конфигурационные переменные, относящиеся к слою. С помощью renpy.layer_at_list() к слою можно применить одно или несколько преобразований.

Определение изображений (Defining Images)[править | править код]

Существует два способа определения изображений. Можно поместить файл изображения в папку с изображениями, либо определить изображение с помощью оператора image. Первый способ просто реализовать, так как он предполагает размещение правильно названных файлов в соответствующей папке, а второй предоставляет вам больше контроля над тем, как определяется изображение, а также позволяет объявить изображения, которые не имеют собственных файлов.

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


◇ Папка изображений[править | править код]

Папка с изображениями называется "images" и находится в директории игры. Когда файл с расширением .jpg или .png помещается в эту папку, расширение файла удаляется, а оставшаяся часть файла принудительно переводится в нижний регистр. Полученное в результате имя файла используется в качестве имени изображения, если изображение с таким именем ранее не было определено.

Этот процесс происходят во всех папках внутри папки с изображениями. Например, все эти файлы определят изображение eileen happy:

game/images/eileen happy.png
game/images/Eileen Happy.jpg
game/images/eileen/eileen happy.png


◇ Оператор image[править | править код]

Для определения изображения используется оператор image. Он состоит из одной логической строки, начинающейся с ключевого слова image, за которым следует имя изображения, знак равенства и отображаемый объект. Например:

image eileen happy = "eileen_happy.png"
image black = "#000"
image bg tiled = LiveTile("tile.jpg")

image eileen happy question = VBox(
    "question.png",
    "eileen_happy.png",
    )

Когда изображение непосредственно не находится в директории игры, необходимо указать папки, расположенные внутри директории. Например, если изображение находится в папке game/eileen/happy.png, в коде необходимо прописать:

image eileen happy = "eileen/happy.png"

Оператор image выполняется во время инициализации перед отображением меню или запуском метки label start. Если операторы image не содержатся внутри блока инициализации, они выполняются так, как если бы они были помещены в блок init с приоритетом 500.

Смотрите также раздел «Оператор image с блоком ATL».

Оператор show (Show Statement)[править | править код]

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

Если оператору show задано точное имя существующего изображения, то это изображение отображается на экране. Иначе Ren'Py попытается найти уникальное изображение, которое:

  • имеет такой же тег, что и тег, указанный в операторе show;
  • имеет все атрибуты, приведенные в операторе show;
  • если изображение с таким же тегом уже отображается, то уникальное изображение разделяет с этим изображением наибольшее число атрибутов.

Если уникальное изображение невозможно найти, возникает исключение.

Если изображение с таким же тегом изображения уже отображается на слое, новое изображение заменяет его. Иначе изображение помещается поверх всех остальных изображений, размещенных на слое (иными словами, ближе всего к пользователю). Такой порядок может быть изменен с помощью свойств zorder и behind.

Оператор show не вызывает взаимодействия. Чтобы изображение действительно отобразилось перед пользователем, необходимо запустить оператор, вызывающий взаимодействие (например, операторы say, menu, pause и with).


Оператор show принимает следующие свойства:

as
Свойство as принимает имя. Это имя используется вместо тега изображения при отображении изображения. Позволяет одному и тому же изображению во второй раз отобразиться на экране.
at
Свойство at принимает одно или несколько простых выражений, разделенных запятыми. Каждое выражение должно быть преобразовано. Преобразования применяются к изображению в порядке слева направо.
Если положение at не задано, Ren'Py сохранит любое существующее преобразование, примененное к изображению. Если преобразование не существует, изображение будет отображаться с помощью преобразования default.
behind
Содержит список из одного или нескольких имён, разделённых запятыми. Каждое имя используется в качестве тега изображения. Изображение отображается за всеми изображениями с указанными тегами, которые показываются в настоящее время.
onlayer
Принимает имя. Показывает изображение на именованном слое.
zorder
Принимает целое число. Оно определяет относительный порядок расположения изображений в пределах слоя, при большее число означает более близкое расположение изображения к пользователю. Это свойство обычно не используется в играх, созданных на движке Ren'Py, но может быть полезно при переносе визуальных новелл с других движков.


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

image mary night happy = "mary_night_happy.png"
image mary night sad = "mary_night_sad.png"
image moon = "moon.png"

Вот несколько примером применения оператора show:

# Стандартное применение оператора show
show mary night sad

# Поскольку 'mary night happy' отображается, следующий оператор эквивалентен show mary night happy
show mary happy

# Показать изображение в правой части экрана.
show mary night happy at right

# Отобразить изображение во второй раз.
show mary night sad as mary2 at left

# Отобразить изображение позади другого.
show moon behind mary, mary2

# Показать изображения на слое, определенном пользователем.
show moon onlayer user_layer


Выражение show
Вариант оператора show заменяет имя изображения на ключевое слово expression, за которым следует простое выражение. Выражение должно быть отображаемым объектом, а отображаемый объект показан на слое. Чтобы скрыть отображаемый объект, тег необходимо задать с помощью оператора as.
Например:
show expression "moon.png" as moon


Оператор show layer
Оператор show layer позволяет применить ко всему слою преобразование или преобразование ATL (например, "master"), используя следующий синтаксис
show layer master at flip
или:
show layer master:
    xalign 0.5 yalign 0.5 rotate 180
Чтобы прекратить применение преобразований к слою, используйте:
show layer master

Оператор scene (Scene Statement)[править | править код]

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

Оператор scene часто используется для отображения изображения на фоновом слое. Например:

scene bg beach


Выражение scene
Как и оператор show, оператор scene может принимать выражения вместо имён изображений.


Очистка слоя
Когда имя изображения полностью исключено, оператор scene очищает все отображаемые объекты со слоя, не показывая другие отображаемые объекты.

Оператор hide (Hide Statement)[править | править код]

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

Оператор hide используют в редких случаях. Если спрайт представляет собой персонажа, то оператор hide нужен только тогда, когда персонаж покидает экран. Когда персонаж изменяет свои эмоции, то вместо оператора hide предпочтительнее использовать оператор show, поскольку он автоматически заменит изображение с тем же тегом.


Оператор hide принимает следующее свойство:

onlayer
Принимает имя. Скрывает изображение из именованного слоя.

Например:

e "Я сваливаю."

hide eileen


Никогда не прописывайте в коде:

hide eileen
show eileen happy

Вместо этого просто напишите:

show eileen happy

Оператор with (With Statement)[править | править код]

Оператор with используется для применения эффекта перехода при изменении сцены, в результате чего отображение и скрытие изображений становится менее резким. Оператор состоит из ключевого слова with, за которым следует простое выражение, которое вычисляется либо для объекта перехода, либо для специального значения None.

Эффект перехода используется между содержимым экрана в конце предыдущего взаимодействия (с переходными экранами и скрытыми отображениями объектами) и текущим наполнением сцены после выполнения операторов show и hide.

Оператор with вызывает взаимодействие. Продолжительность этого взаимодействия контролируется пользователем и он может привести к его преждевременному завершению.

Полный список переходов, которые можно использовать, приведен в разделе «Переходы».

Ниже приведён пример применения оператора with:

show bg washington
with dissolve

show eileen happy at left
show lucy mad at right
with dissolve

Вышеуказанный код приводит к возникновению двух переходов:

  • Первый оператор with использует переход dissolve для изменения экрана от того, что было ранее отображено на фоне washington (по умолчанию переход dissolve определяется как .5 секундное растворение).
  • Второй переход происходит после отображения изображений Эйлин и Люси. Это приводит к растворению сцены, состоящей исключительно из фона, к сцене, состоящей из всех трех изображений. В результате два новых изображения растворяются одновременно.


◇ Оператор with None[править | править код]

Выше приведен пример с двумя переходами dissolve. Но что, если мы хотим, чтобы фон появился мгновенно, а затем растворились два персонажа? Простое исключение первого оператора with приведёт к растворению всех трех изображений, но нам нужен способ при котором первое изображение отобразится мгновенно.

Оператор with изменяет поведение при задании специального значения None. Оператор with None приводит к появлению сокращенного взаимодействия, не меняя то, что видит пользователь. При следующем переходе взаимодействие начнётся со сцены, которая отображается так, как и в конце этого сокращенного взаимодействия.

Например, в:

show bg washington
with None

show eileen happy at left
show lucy mad at right
with dissolve

В вышеуказанном коде происходит только один переход: от фона washington к сцене, состоящей из всех трех изображений.


◇ Выражение with операторов scene, show и hide[править | править код]

Операторы show, scene и hide могут принимать необязательное выражение with, позволяющее комбинировать переход с отображением или скрытием изображения. Это выражение следует за операторами, располагаясь в конце той же логической строки. Выражение with начинается с ключевого слова with, за которым следует простое выражение.

Выражение with равноценно предшествующей строке с оператором with None и следующему за ним оператору with, содержащему текст выражения with. Например:

show eileen happy at left with dissolve
show lucy mad at right with dissolve

аналогично:

with None
show eileen happy at left
with dissolve

with None
show lucy mad at right
with dissolve

Операторы window show и hide (Hide and Show Window)[править | править код]

Оператор window используется для управления окном, если оно отображается, когда персонаж не говорит, например, во время переходов и пауз. Оператор window show вызывает отображение окна, в то время как оператор window hide скрывает окно.

Если задан дополнительный переход, он используется для отображения и скрытия окна. Если не задан, по умолчанию используются config.window_show_transition и config.window_hide_transition. Если в качестве перехода задано значение None, то это не позволяет переходу произойти.

Само окно отображается при вызове переменной config.empty_window. По умолчанию она способствует тому, что персонаж-рассказчик произносит пустую строку:

    show bg washington
    show eileen happy
    with dissolve

    window show dissolve

    "Я  могу что-то говорить..."

    show eileen happy at right
    with move

    "... и перемещаться, сохраняя отображение диалогового окна."

    window hide dissolve

Функции изображения (Image Functions)[править | править код]

renpy.can_show(name, layer=None, tag=None)

Функция определяет, может ли name использоваться для отображения изображения. Интерпретирует name как тег и атрибуты. А также объединяется с атрибутами отображаемого в данный момент изображением с tag на layer в попытке определить уникальное изображение для показа на экране. Если уникальное изображение может быть отображено, возвращает имя этого изображения в виде кортежа. Иначе возвращает значение None.
tag
Тег изображения для получения атрибутов. Если не задан, по умолчанию используется первый компонент name.
layer
Проверяемый слой. Если принимает значение None, для tag используется слой по умолчанию.


renpy.check_image_attributes(tag, attributes)

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


renpy.copy_images(old, new)

Переписывает изображения, начинающиеся с одного префикса, на изображения, начинающиеся с другого. Например:
renpy.copy_images("eileen", "eileen2")
Код, приведённый выше, создает изображение, начинающееся с "eileen2" для каждого изображения, начинающегося с "eileen". Если существует "eileen happy", будет создана "eileen2 happy".
old
Разделенная пробелами строка, содержащая компоненты старого имени изображения.
new
Разделенная пробелами строка, содержащая компоненты нового имени изображения.


renpy.get_attributes(tag, layer=None)

Возвращает кортеж, задающий атрибуты изображения для изображения с tag. Если изображение не отображается, возвращает значение None.
layer
Проверяемый слой. Если принимает значение None, для tag используется слой по умолчанию.


renpy.get_available_image_tags()

Предоставляет список определённых тегов изображений.


renpy.get_hidden_tags(layer='master')

Возвращает набор тегов изображений на layer, которые в настоящее время скрыты, но всё еще имеют связанные с ними данные атрибута.


renpy.get_image_bounds(tag, width=None, height=None, layer='master')

Если изображение с tag существует на layer, возвращает ограничительную рамку этого изображения. Возвращает значение None, если изображение не найдено.
Ограничительная рамка представляет собой (x, y, ширина, высота) кортеж. Компоненты кортежей выражаются в пикселях и могут быть числами с плавающей точкой.
width, height
Ширина и высота области, содержащей изображение. Если принимает значение None, то по умолчанию ширина и высота экрана, соответственно.
layer
Если принимает значение None, для tag используется слой по умолчанию.


renpy.get_ordered_image_attributes(tag, attributes=(), sort=None)

Возвращает список тегов изображений, упорядоченных таким способом, который понятен пользователю.
attributes
Если параметр присутствует, учитываются только атрибуты, совместимые с заданными атрибутами (Совместимость означает, что атрибуты могут находиться в одном изображении одновременно.)
sort
Если принимает значение None, возвращенный список атрибутов сортируется. Это функция, которая должна использоваться в качестве тай-брейка.


renpy.get_placement(d)

Позволяет разместить отображаемый d. На эту информацию дается очень мало гарантий, так как она может измениться при отображении и может не существовать до первого отображения.
Возвращает объект со следующими полями, каждое из которых соответствует свойству стиля:
  • xpos
  • xanchor
  • xoffset
  • ypos
  • yanchor
  • yoffset
  • subpixel


renpy.get_registered_image(name)

Если изображение с таким же именем было зарегистрировано в renpy.register_image, возвращает его. Иначе возвращает значение None.


renpy.get_say_image_tag()

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


renpy.get_showing_tags(layer='master', sort=False)

Возвращает набор тегов изображений, в данный момент отображаемых на layer. Если sort принимает значение True, возвращает список тегов от конца к началу.


renpy.has_image(name, exact=False)

Возвращает значение True, если существует изображение с name, и значение False, если такое изображение не существует.
name
Либо последовательность символов, задающая имя изображения, либо кортеж строк с указанием компонентов имени.
exact
Возвращает значение True, тогда и только тогда, когда существует изображение с таким же именем - параметризованные соответствия не учитываются).


renpy.list_images()

Возвращает список изображений, добавленных в Ren'Py, в виде списка строк с пробелами между компонентами имени.


renpy.seen_image(name)

Возвращает значение True, если именованное изображение хотя бы раз было показано в системе пользователя. Изображение считается просмотренным, если оно было отображено с помощью оператора show, оператора scene или функции renpy.show(). Обратите внимание, что есть случаи, когда пользователь не видел изображение, как оператор show за которым сразу же следует оператор hide.


renpy.showing(name, layer='master')

Возвращает значение True, если на layer отображается изображение с тем же тегом, что и name.
image
Может быть строкой, задающей имя изображения, или кортежем, содержащим каждый из компонентов имени изображения. Также может быть строкой, содержащей только тег изображения.
layer
Слой для проверки. Если принимает значение None, для тега используется слой по умолчанию.

renpy.start_predict(*args)

Данная функция принимает в качестве аргументов один или несколько отображаемых объектов. Это заставляет Ren'Py прогнозировать эти отображаемые объекты во время каждого взаимодействия, пока они не будут удалены renpy.stop_predict().
Если отображаемое имя представляет собой последовательность символов, содержащую один или несколько символов *, звездочки используются в качестве шаблона специальных символов.
Если в последовательности символов есть по крайней мере одна . — шаблон сопоставляется с именами файлов, иначе он сопоставляется с именами изображений.
Например, данный код
$ renpy.start_predict("eileen *")
начинает предсказывать все изображения с именем Эйлин, в то время как:
$ renpy.start_predict("images/concert*.*")
соответствует всем файлам, начинающимся с concert в директории images.


renpy.stop_predict(*args)

Данная функция принимает в качестве аргументов один или несколько отображаемых объектов. Это заставляет Ren'Py перестать прогнозировать эти отображаемые объекты во время каждого взаимодействия.
Шаблоны специальных символов можно использовать, как описано в renpy.start_predict().

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

Статья "Displaying Images" на английском языке.


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