Renpy как сделать меню свое
Перейти к содержимому

Renpy как сделать меню свое

  • автор:

Renpy как сделать меню свое

Зарегистрированный пользователь может оставлять отзывы, оценивать статьи и решать задачи на курсе. В дальнейшем пользователи смогут делиться и своим контентом.

—> Приключения —> —> Фантастика —> —> Комедии —> —> Ужасы —> —> 2020 —> —> 2019 —> —> 2018 —> —> 2017 —> —> 2016 —> —> 2015 —> —> —> —> —> —> 5.0 —> —> —> —> —> —> 4.0 —> —> —> —> —> —> 3.5 —> —> —> —> —> —> 3.0 —> —> —> —> —> —> 2.5 —>

Популярные новеллы

Lucy — The Eternity She Wished For

The House in Fata Morgana

Princess Evangile

Перезапись

Изменение меню в RenPy

Время на чтение:
Автор статьи:

Наверное, при первом запуске своей новеллы вы заметили невзрачные и одноцветные фоны главного меню, меню с настройками и т.д. Если вы еще не разобрались, как это исправить, то сейчас самое время. Разберемся, как заменить встроенное изображение на своё или же вовсе нарисуем весь внешний вид новеллы с нуля.

Изменение изображения в главном меню

Изменение картинки в главном меню делается очень просто: необходимо поместить нужное изображение в папку с файлами графического интерфейса. Рассмотрим подробнее.

В корневой папке “game” проекта RenPy есть папка gui. В этой папке находятся изображения с названием “main_menu” и “game_menu” (если вы их не удаляли и не меняли настройки проекта в файле “options.rpy”). Это и есть изображения главного меню и меню игры в целом.

Посмотрите разрешение изображений через свойства файла или любым другим удобным способом. Это разрешение соответствует тому, которое вы выбрали при создании проекта.

Самый простой способ изменения картинок — просто заменить их на свои с таким же разрешением. Но есть еще один момент: по дефолту RenPy выводит название игры поверх фона. Если оно вам мешает, то это можно поправить через файл “options.rpy”.

Находим строчку следующую строчку и меняем True на False.

define gui.show_name = True
Создание своего меню

Для начала рассмотрим изменение первичного дизайна новеллы, который предлагает сам RenPy. В той же папке gui есть еще несколько подпапок. Одна из них называется “overlay”. Эти изображения накладываются поверх фонов.

Если изображения кажутся слишком темными или наоборот слишком светлыми, то их запросто можно отредактировать в редакторе Gimp или в фотошопе (или в любом другом привычном редакторе). Можно поменять прозрачность, добавить изображениям контраста или вовсе заменить их на свои (с учетом разрешения экрана игры).

Далее можно поменять шрифт в меню, а именно: его цвет. Заходим в файл gui.rpy и ищем строчку:

define gui.idle_color

Это не выделенные пункты меню. После знака равенства пишем любой подходящий цвет в шестнадцатеричном формате.

Есть вариант полностью перерисовать меню игры под себя: если вы хорошо рисуете или у вас есть дизайнер, то подготовьте все нужные экраны, изображения кнопок, боковых панелей и т.д. Узнать список всех необходимых файлов можно из созданного проекта в RenPy: внимательно изучите папку gui, просмотрите вложенные папки. Определите, какие изображения за что отвечают. Узнать это можно из названия картинок и опираясь на официальный гайд по изменению интерфейса.

Рассмотрим вариант изменения главного меню с созданием своих кнопок.

Для этого необходимо подготовить фоновое изображение меню, изображение с пунктами меню (без фона) и изображение с выделенными пунктами меню (как будто бы на них наведена мышка).

Пример фонового изображения

Пример изображения с пунктами меню

Пример выделенных пунктов меню

! У вас должен быть не серый фон, а прозрачный. Скачать картинки из примера можно будет в конце статьи.

Далее все три изображения перемещаем в папку “gui”. Изображение с фоном можно назвать “main_menu”, с кнопками “menu_normal”, с подсвеченными кнопками “menu_hover”. Чтобы настроить отображение своего меню заходим в файл screens.rpy и находим раздел screen main_menu(). В этом блоке можно смело всё удалить, оставив лишь tag menu.

screen main_menu(): tag menu

Воспользуемся объектом imagemap, у которого можно указать фоновое изображение (ground), изображения с кнопками (idle и hover).

screen main_menu(): tag menu imagemap: ground "gui/main_menu.png" idle "gui/menu_normal.png" hover "gui/menu_hover.png"

Но надо еще указать координаты для каждой кнопки, потому что мы задали по одному изображению и RenPy думает, что у нас есть одна большая кнопка на весь экран: исправить это можно через hotspot, указав ему стартовую координату кнопки, её ширину и высоту.

screen main_menu(): tag menu imagemap: ground "gui/main_menu.png" idle "gui/menu_normal.png" hover "gui/menu_hover.png" hotspot(x, y, width, height) 

Посмотреть эти координаты можно в графическом редакторе. Когда вы водите мышкой по экрану, то по краю изображения можно найти числа в пикселях или увидеть координаты в отдельном меню (например, в фотошопе стоит зайти в “Окно”>”Навигатор” и выбрать вкладку “Инфо”).

Необходимо определить координаты (это и есть x и y) левого верхнего угла каждой кнопки. Высоту можно определить при помощи разницы координаты Y нижнего левого угла кнопки и ее верхнего левого угла. Ширину аналогично при помощи разницы координаты X правого верхнего угла и левого верхнего угла.

Отлично, мы нашли кнопку на экране. Осталось определить, что эта кнопка будет делать при помощи action. Action бывают следующие: Start — для запуска игры, ShowMenu — для показа какого-то конкретного меню, Quit — выход из игры. Действиям можно передавать параметры: название меню или флаг, который будет указывать на подтверждение выхода из игры.

Вот как это выглядит в коде:

screen main_menu(): tag menu imagemap: ground "gui/main_menu.png" idle "gui/menu_normal.png" hover "gui/menu_hover.png" hotspot(30, 150, 240, 60) action Start() hotspot(30, 240, 320, 80) action ShowMenu("load") hotspot(30, 320, 330, 80) action ShowMenu("preferences") hotspot(30, 400, 250, 80) action ShowMenu("about") hotspot(30, 610, 220, 60) action Quit(confirm=True)

Теперь все кнопки будут вести на нужные экраны. Но есть одна проблема: экраны настроек, сохранений, помощи будут выглядеть как прежде. А всё дело в том, что все они настраиваются отдельно друг от друга, но по тому же принципу, что был рассмотрен в этой статье. Так что вы можете полностью перерисовать внешний вид своей новеллы до неузнаваемости, главное запастись красивыми изображениями и разобраться во всех экранах.

С дальнейшей кастомизацией помогут официальный гайд и многочисленные видео на YouTube.

Дата публикации: Окт. 25, 2022

ТЕМА: Создание меню

Приветик всем :3
Я совсем недавно начала изучение движка Ren’Py и ещё плохо с ним знакома. Сейчас я делаю свою новеллу и передо мной встала задача сделать красивое меню, а то стандартное мне не нравится. Хотелось бы сделать что то вроде такого:

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]

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

Если вас не затруднит, объясните пожалуйста как сделать нечто подобное. Заранее спасибо :3

Последнее редактирование: 11 года 11 мес. назад от Kuro-chan.
Администратор запретил публиковать записи гостям.

Re: Создание меню 11 года 11 мес. назад #51199

Программист RubyПрограммист JavaScript ВетеранДаритель СтимкеяОратор

Чтоб сделать горизонтальное меню, откройте скрипт (кнопка «Edit Script») и на строчке №190 во вкладке «screens.rpy», замените vbox на hbox.
Там же, на строчках 187 и 188, можно изменить положение блока меню на экране. Насколько понял, число после точки означает количество процентов. Т.е. значение 50, расположит меню по центру экрана.

Насчет меню из своей картинки. Выходит примерно так:

result = renpy.imagemap("main_menu.jpg", "main_menu.jpg", [ (0, 0, 114, 35, "start") (114, 0, 228, 35, "load") (228, 0, 342, 35, "preference") (342, 0, 456, 35, "help") (456, 0, 570, 35, "quit") ]) if result == "start": Start() elif result == "load": ShowMenu("load") elif result == "preference": ShowMenu("preferences") elif result == "help": Help() elif result == "quit": Quit(confirm=False)

Последнее редактирование: 11 года 11 мес. назад от Lekste.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Kuro-chan

Re: Создание меню 11 года 10 мес. назад #51218

Это в «options.rpy» вставлять нужно?
После этой строки?
Или я совсем ничего не понимаю :с

layout.button_menu()

У меня выглядит так:

######################################### # Планы ## Здесь активируется использование игрового меню ## ввыполненного из кнопок. layout.button_menu() $ result = renpy.imagemap("bg/main1.jpg", "bg/main2.jpg", [ (6, 550, 190, 579, "start"), (238, 550, 431, 579, "load"), (495, 550, 627, 579, "preference"), (705, 550, 784, 579, "quit"), ], focus="imagemap") if result == "start": Start() elif result == "load": ShowMenu("load") elif result == "preference": ShowMenu("preferences") elif result == "quit": Quit(confirm=False) #########################################

Выдает ошибку при проверке, говорит что синтаксическая ошибка.
Последнее редактирование: 11 года 10 мес. назад от Kuro-chan.
Администратор запретил публиковать записи гостям.

Re: Создание меню 11 года 10 мес. назад #51219

Нужно делать вот так:

# Планы ## Здесь активируется использование игрового меню ## ввыполненного из кнопок. layout.button_menu() init -2 python: layout.imagemap_main_menu("main1.jpg", "main2.jpg", [ (300, 250, 495, 270, "Start Game"), (300, 273, 495, 294, "Load Game"), (300, 298, 495, 318, "Preferences"), (300, 323, 495, 343, "Quit"), ]) #########################################

Lekste спасибо за идею с imagemap ^^

И да, кстати новое меню:

Renpy как сделать меню свое

Приветствую в данном руководстве опытных и не очень мододелов. В данном руководстве написано, как создать собственное меню и дополнения к нему в своём моде.

  • https://steamcommunity.com/sharedfiles/filedetails/?id=690911411
  • https://steamcommunity.com/sharedfiles/filedetails/?id=1734251131

1

1

В избранное
В избранном
Поделиться
Этот предмет добавлен в избранное.

AkkuChan
Не в сети
24 сен. 2022 в 22:25
28 мая. 2023 в 7:45

790 уникальных посетителей
102 добавили в избранное

Оглавление руководства

Предисловие

Плавное начало мода и появление меню в целом

А что насчёт собственного меню? Способ первый.

А что насчёт собственного меню? Способ второй.

Кстати про кнопки

Подробнее про action

Ещё немного про меню

Позиционирование

Галерея изображений. 1 Способ

Галерея изображений. 2 способ

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

Послесловие

Комментарии
Предисловие

Не хочется, чтобы данное руководство послужило толчком в появлении модов с меню, состоящим из кнопок «начать» и «выйти». Меню должно иметь практическую пользу, а не чтобы было. Это всё моё мнение, прислушиваться к нему или нет — решать вам. Решил выговориться заранее. А теперь к руководству!

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

Плавное начало мода и появление меню в целом

Перед началом создания меню хотелось бы рассказать про плавный старт мода, т.е. плавное затухание меню выбора модов и плавное появление начала вашего мода.
Для этого вам надо всего-лишь начать мод с этих строк:

label NAME: scene bg black with dissolve # вызываем переход на всё, что сейчас на экране, а не только на фон # далее просто вызываем screen нашего меню call screen MENU with dissolve

Довольно простая вещь, однако многие её не используют.

Кстати, именно так и появляется ваше меню. NAME в label — это то, что вы указывали в mods:

С лейбла NAME и начинается ваш мод, этакая точка входа. С неё и перебрасывайте на меню.

А что насчёт собственного меню? Способ первый.

Меню можно сделать двумя способами. Либо через imagemap, либо через imagebutton. Ну, хотя можно сделать и так и так одновременно. Пойдём по порядку.

В Imagemap нам необходимо три картинки (можно и больше, об этом позже). Фон, неактивные кнопки и активные кнопки. (фон и неактивные кнопки при желании можно сделать одним изображением). Ренпай, при наведении на кнопку, будет «вырезать и вставлять» активную кнопку в местоположение неактивной.
Предположим, вы работаете в Photoshop’е и сделали эти самые картинки. Теперь нам нужны некоторые данные, записывайте их или запоминайте. Находим левый верхний угол вашей картинки, предположим, у меня это будет 256 по оси X и 72 по оси Y. Теперь вычисляем правый нижний угол, пусть у меня он будет 510 по X и по Y 121. Теперь мы вычитаем из них первые числа, т.е. 510-256=254 и 121-72=49. Записываем или запоминаем Левый верхний угол и разницу правого угла и левого. Т.е. (256, 72, 254, 49) (Именно так координаты и записываются в кнопку imagemap)

Но как обозначить кнопку в коде? За это у нас отвечает оператор hotspot.

screen MENU: tag menu imagemap: ground «background.jpg» idle «buttons_idle.png» hover «buttons_hover.png» hotspot (256, 72, 254, 49) action Call(«START», transition=dissolve)

Теперь давайте разберёмся с вышенаписанным:

  • Мы создаем экран MENU (название заменить);
  • tag не дает нам накладывать части экранов друг на друга, то есть, если у нас есть два экрана с одним тегом, то при появлении, второй заменит первый. Также мы можем скрывать по тегу экраны;
  • ground — это наш фон. Указываем в кавычках путь к изображению, к фону или просто пишем уже объявленное изображение (тоже в кавычках);
  • idle — это наши неактивные кнопки, тоже указываем путь;
  • hover — активные кнопки. Указываем путь;
  • hotspot — наша кнопка, в скобках указываем координаты, которые получили ранее.

Но что же такое action? А это как раз таки действия, которые будет выполнять игра при нажатии на кнопку. Есть множество действий, но я распишу лишь некоторые в другом отделе (ибо action работает и в imagebutton и в imagemap), чтобы не повторяться.

А что насчёт собственного меню? Способ второй.

И вот мы добрались до второго способа, а именно imagebutton. Этот способ позволяет нам объявлять каждую кнопку отдельным изображением. Т.е. нам нужно как минимум по два изображения на кнопку, неактивная и активная. Давайте объявим её:

screen MENU: tag menu add «background.png» # добавляем наш фон imagebutton: # тут мы можем прописать как отдельно двумя строчками, так и одной
# Двумя это выглядит так:
idle «button_idle.png» hover «button_hover.png # а чтобы объявить одной строкой, нам надо, чтобы наши картинки оканчивались на _idle и _hover соответственно auto «button_%s» # Далее указываем позицию нашей кнопки, подробнее об этом в разделе Позиционирование xpos 256 ypos 72 action Call(«START», transition=dissolve)

Заметили, что мы использовали add? Небольшое отступление, оператор add позволяет нам добавлять что-то на screen, например изображение.

В данном случае мы указываем только одну точку, нам не нужна длина и высота кнопки.
Главное преимущество этого метода — возможность заменить кнопку, не меняя всё меню в фотошопе.

Про action будет наш следующий раздел.

Кстати про кнопки

Если в вашем меню кнопки — это просто текст, то нет нужды для этого делать их изображениями, ведь можно использовать textbutton. Всё, что нам надо для этого, это шрифт, его размер в пикселях и положение. Положение текстовой кнопки работает так же, как и imagebutton.

textbutton «Здесь может быть ваша кнопка»: xpos 256 ypos 72 text_idle_color «#fff» text_hover_color «#aaa» text_size 30 text_font «font.ttf» action Call(«START», transition=dissolve)

textbutton, как и imagebutton, можно прописывать как блоком, так и в строку, кому как больше нравится. То есть:

textbutton «Здесь может быть ваша кнопка» xpos 256 ypos 72 text_idle_color «#fff» text_hover_color «#aaa» text_size 30 text_font «font.ttf» action Call(«START», transition=dissolve)

Но блоком смотрится приятнее и читается понятнее.

Но ранее говорилось об ещё каких-то картинках для кнопок, так вот. Если в вашем меню, при переходе на другой экран, остаются элементы предыдущего, то можно использовать картинки selected_idle и selected_hover. Т.е., при нажатии на данную кнопку, эта кнопку останется выделенной, пока выполняемое ею действие активно. Если вы вызываете какой-то экран с данными операторами, то вместо Show нужно использовать ToggleScreen:

screen MENU: imagemap: ground «background.jpg» idle «buttons_idle.png» hover «buttons_hover.png» selected_idle «buttons_selected_idle.png» selected_hover «buttons_selected_hover.png» hotspot (256, 72, 512, 432) action ToggleScreen(«GALLERY», transition=dissolve)

Но если вы хотите, чтобы несколько экранов были на экране, но нажимался только текущий, то пропишите в этом экране modal True.

screen GALLERY: tag menu modal True
Подробнее про action

Нам нужны кнопки, чтобы они что-то делали. Ниже я выписал одни из самых важных действий, которые понадобятся в каждом меню (или почти в каждом)

  • Call(label, *args) — завершает текущий оператор и вызывает label. В аргументах может принимать transition, т.е. каким будет переход от оператора к Лейблу.
  • Show(screen, *args) — приводит к отображению другого экрана. screen – строка, в которой указано имя экрана. Также принимает transition
  • Hide(screen, transition=None) — приводит к тому, что экран с именем screen будет скрыт, если он показан. Принимает transition.
  • Return() — возвращается к предыдущему действию. Крайне полезно, если ваше меню состоит из нескольких экранов. Этот оператор будет возвращать вас на предыдущий экран.
  • NullAction() — кнопка, которая ничего не делает. Думаю тут понятно.
  • With(transition) — оператор, который используется с другими операторами. Он задает плавность операторам, которые не принимают в себя transition. Например, Return(), MainMenu() и т.д.
  • MainMenu() — возвращает нас в главное меню, т.е. в меню Бесконечного лета.
  • Quit() — закрывает игру. Можем указать в скобках confirm=True, чтобы после нажания кнопки у нас вылезло окно подтверждения (ну та, где Юля сидит и спрашивает, хотим мы выйти или нет)

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

action [MainMenu(), With(dissolve)]

Есть множество операторов, как например, задание значения переменной, произведение музыки и её остановка, условие, выполнение написанной вами python-функции и т.д.

Все они описаны в документации Ren’py: Тык [ru.renpypedia.shoutwiki.com]

Ещё немного про меню

В экранах мы можем прописывать не только imagemap, кнопки и так далее, мы также можем писпользовать таймер, python-блоки и условия.

default test_lv = None screen TEST: timer 2 action SetVariable(«test_lv», True) python: renpy.pause(2, hard=True) if test_lv: imagebutton: auto «button_%s» xcenter 0.5 ycenter 0.5 action NullAction()

Таймер позволяет нам выполнить какое-либо действие через какое-то время, например через две секунды. Отсчёт начинается с момента появления экрана.
В python-блоке мы можем вызывать и прописывать какие-либо функции, будь то написанные вами или имеющиеся изначально из Ренпая и написанные кодером Бесконечного лета.
Ну с условием, думаю, всё понятно.

Позиционирование

Как же указывать положение нашей картинки/кнопки? А всё просто.
Сперва определимся, как мы указываем аргументы. Есть два способа, по пикселям и через десятичные числа, где 0.0 до 1.0 — границы нашего экрана.
Первый способ по пикселям мы указываем положение по X от 0 до 1920 на ПК (на телефонах это до 1280) и до 1080 по Y (720 на телефонах).
Второй — от 0.0 до 1.0 (можно и меньше/больше, но тогда изображение будет выходить за рамки). Этот метод лучше, ибо при портировании на телефоны, нам не нужно париться с положением кнопок, но и высчитать положение сложнее.
Ренпай сам определяет, какое вы ему указываете значение.
Если у позиции в начале стоит x или y, то оператор перемещает по соответствующей оси (указывается одно значение)

a и b — ваши координаты

— pos(a, b), xpos a, ypos b. Изначально точка позиционирования изображения находится в верхнем левом углу изображения. Поэтому, при перемещении изображения с помощью pos, мы указываем положение именно верхнего левого угла. (например pos(0, 0) поставит изображение в левый верхний угол)

— center(), xcenter, ycenter Ренпай ставит точку позиционирования в центр изображения, т.е. вы переносите изображение за середину. (например center(0.5, 0.5) поставит изображение в центр)

Более подробно про позиционирование и ATL в целом Тут [www.renpy.org]
Галерея изображений. 1 Способ

Что же, вот и галерея изображений. Хотелось бы начать с того, что в Ренпае есть встроенная Галерея, с которой можно работать. И так же можно сделать простыми кнопками. Это всё одинаково просто.
Однако советую воздержаться от её использования, ибо с ней имеется ряд проблем, которые надо исправлять/учитывать.

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

# для создания галереи с фонами, которые открываются только после их просмотра,
# создаём постоянную переменную
default persistent.bg_1 = None # также для создания подобной галереи создаём переменную, в которую будет записываться текущий фон на экране,
# чтобы, нажав на фон, можно было его увеличить на весь экран. Если это не надо, то не пишем её
default img_now = None # и затем ставим её истинное значение после просмотра фона в сценарии label START: scene bg bg_1 $ persistent.bg_1 = True screen GALLERY(): tag menu add «background.jpg» imagebutton: if persistent.bg_1: idle «bg_1_prev» #внимание, данный фон у вас изначально в 1920х1080, следовательно, здесь он будет такого же размера. Сделайте изображение меньше и вызывайте его, но в переменную суйте фон 1920х1080. в моём случае это заранее уменьшенный фон с припиской _prev xpos 210 ypos 101 # заталкиваем в переменную название нашего фона. Если вам не надо, чтобы фон увеличивался на весь экран, просто убери строчку ниже action SetVariable(«img_now», «bg bg_1»), Show(«screen_img_now», transition=dissolve) # данный экран нам нужен, чтобы вызвать изображение кнопкой. Если нажать на фон, то он исчезнет
# если вам не надо, чтобы фон открывался на весь экран, просто уберите этот screen
screen screen_img_now: # делаем экран непрозрачным, чтобы случайно не тыкнуть что-нибудь ненужное modal True imagebutton: idle img_now xpos 0 ypos 0 action Hide(«screen_img_now», transition=dissolve)

Галерея изображений. 2 способ

И так, вместо простых кнопок можно использовать встроенную Gallery().

default persistent.bg_1 = None # для создания галереи с помощью встроенной функции Галереи, создаем объект Галереи в init python блоке init python: bg = Gallery() # так же мы можем указать, с какой планостью будут раскрываться изображения на большой экран bg.transition = dissolve # теперь добавляем сами кнопки, добавляем изображения. В моём случае фоны bg.button(«slot1») # slot1 — название нашей кнопки. Название может быть произвольным bg.image(«bg_1_prev») # Само изображение, которое будет кнопкой. Внимание, изображение не сжимается само, т.е. оно будет показываться в своём размере (как в предыдущем примере). bg.condition(«persistent.bg_1») # указываем условие, при котором наш фон будет отображаться # подобное используем для каждой кнопки галереи. Либо делаем автообъявление. # теперь делаем экран самой галереи screen GALLERY(): tag menu add «background.jpg» # Добавляем кнопку на экран. В первых кавычках указываем название кнопки, созданное ранее. Затем фон, который будет отображаться при открытии (1920х1080). locked — это то, что будет отображаться, пока кнопка недоступна. Ну и указываем положение кнопки. add bg.make_button(«slot1», «bg bg_1″, locked=»lock.png», xpos=210, ypos=101)

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

Теперь давайте разберемся с музыкальной комнатой, в которой мы можем слушать музыку.
Для удобства всего этого желательно добавлять всю музыку в массив или список, как это реализовано в оригинале БЛ (music_list[«blow_with_the_fire»]. Массив music_list, «blow_with_the_fire» — элемент массива, который хранит путь к песне.)

Объявлять их можно тупо как:

init python: my_music = dict(); my_music[«music1»] = «music/music1.mp3» #или, например: music_list = dict() for mus in [«music1», «music2»]: my_music[mus] = «audio/music/» + mus + «.mp3»

Либо, что будет лучше и удобнее, делать автообъявление (об этом я когда-нибудь попозже расскажу в отдельном разделе Автообъявления)
Вообще, мы будем использовать ту же встроенную в Ренпай музыкальную комнату, в которой можно так же самому прописывать каждую строчку. Но зачастую, музыки намного больше, чем фонов, так что прописывать каждую строчку будет крайне муторно.

Предположим, у нас есть массив my_music. В нём есть несколько композиций. Нам нужно создать нашу MusicRoom.

#здесь мы задаём объект классу MusicRoom, в скобках которого можно указать плавность затухание и начала песни.
#далее делаем цикл, в котором добавляем в mr нашу музыку, которая всегда открыта.
init python: mus = MusicRoom(fadeout=0.5, fadein=0.5) for i in my_music: mr.add(my_music[i], always_unlocked = True) #далее создаём экран нашей музыкальной комнаты screen MusicRoom(): tag menu #vbox позволяет нам указывать элементы экрана сверху вниз, не указывая положение каждого. Так же можно и слева направо, только вместо vbox будет hbox. Просто указываем количество пикселей между элементами в spacing.
#далее указываем положение нашего vbox’a, (мы так же можем указать и границы, дойдя до которых, элемент перенесется. Для этого указываем либо как в hotspot, только area(a, b, c, d). Или указываем длину по ширине в xmaximum и ymaximum.
vbox: pos(500, 750) for i in my_music: spacing 5 textbutton i.replace(«_», » «) text_idle_color «#aaa» text_hover_color «#ccc» text_size 30 action mus.Play(my_music[i]) #Далее нам цикл прописывает каждую кнопку. Т.е. нам не надо 20-30 песен прописывать самим. Т.к. элементы mus и my_music одинаковы, то мы просто проигрываем необходимую нам песню из изначального массива.

Послесловие

Данное руководство было написано со скуки и чтобы скидывать его людям, которые не знают, как делать меню. Ранее была мысль сделать руководство, в котором бы рассказывалось о всяких разных фичах, функциях, способах, которые могут быть полезны мододелам. Например, Галерея изображений, Музыкальная комната, замена интерфейса, автообъявления изображений, звуковых файлов и так далее.
Если вам это интересно, пишите в комментариях, и я может быть их напишу и добавлю.

Если были совершены какие-нибудь ошибки в руководстве или у вас возникли проблемы при создании меню, пишите, помогу.

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:

  • The Ren’Py Home Page
  • Download the Latest Version
  • Ren’Py Documentation
  • Quickstart Tutorial
  • Ren’Py Cookbook
  • Перевод для версии 6.11.2 (26.12.2010)
  • Готовые локализованные дистрибутивы для версии 6.9.3 можно найти здесь.

Далее представлен перевод для версии 6.8.0 (10.12.2008)

Перевод игрового/основного меню

Создайте файл translations.rpy с представленным ниже содержимым в папке с игрой, либо в папке common.

# Данный файл содержит список всех переведенных фраз "общего" режима Ren'Py. init python: # Переводимые строки файла common/00developer.rpy config.translations[u'Developer Menu'] = u'Меню Разработчика' config.translations[u'Return to the developer menu'] = u'Вернуться к меню разработчика' # Переводимые строки файла common/00library.rpy config.translations[u'Skip Mode'] = u'Режим Пропуска' config.translations[u'Fast Skip Mode'] = u'Быстрый Пропуск' config.translations[u"While Ren'Py games may be playable without the renpy module, some features may be disabled. For more information, read the module/README.txt file or go to http://www.bishoujo.us/renpy/."] = u"Игры Ren'Py могут запускаться и без модуля renpy, но некоторые функции возможно будут отключены. Более подробную информацию можно прочесть в файле module/README.txt или по адресу http://www.bishoujo.us/renpy/." config.translations[u'renpy module not found.'] = u'не найден модуль renpy.' config.translations[u'The renpy module could not be loaded on your system.'] = u'Не получается загрузить модуль renpy под вашей системой.' config.translations[u'Old renpy module found.'] = u'Обнаружен устаревший модуль renpy.' config.translations[u"An old version (%d) of the Ren'Py module was found on your system, while this game requires version %d."] = u"Обнаружена устаревшая версия (%d) модуля Ren'Py. Игра требует версии старше %d." config.translations[u'Please click to continue.'] = u'Для продолжения нажмите левую кнопку мыши.' # Переводимые строки файла common/00menus.rpy config.translations[u'Start Game'] = u'Новая Игра' config.translations[u'Continue Game'] = u'Продолжить' config.translations[u'Preferences'] = u'Настройки' config.translations[u'Quit'] = u'Выйти' config.translations[u'Return'] = u'Вернуться' config.translations[u'Save Game'] = u'Сохранить' config.translations[u'Load Game'] = u'Загрузить' config.translations[u'Main Menu'] = u'Главное Меню' config.translations[u'Are you sure you want to quit?'] = u'Вы уверены, что хотите выйти?' config.translations[u'Are you sure you want to return to the main menu?\nThis will lose unsaved progress.'] = u'Вы уверены, что хотите перейти к главному меню?\nНе сохраненное прохождение будет утеряно.' # Переводимые строки файла common/_layout/one_column_preferences.rpym config.translations[u'Display'] = u'Режим Экрана' config.translations[u'Transitions'] = u'Переходы' config.translations[u'Skip'] = u'Пропуск' config.translations[u'Begin Skipping'] = u'Начать Пропуск. ' config.translations[u'After Choices'] = u'После Выбора' config.translations[u'Text Speed'] = u'Скорость Текста' config.translations[u'Auto-Forward Time'] = u'Время Автопрокрутки' config.translations[u'Music Volume'] = u'Громкость Музыки' config.translations[u'Sound Volume'] = u'Громкость Звуков' config.translations[u'Voice Volume'] = u'Громкость Голоса' config.translations[u'Joystick. '] = u'Джойстик. ' # Переводимые строки файла common/_layout/classic_yesno_prompt.rpym config.translations[u'Yes'] = u'Да' config.translations[u'No'] = u'Нет' # Переводимые строки файла common/_layout/scrolling_load_save.rpym config.translations[u'Empty Slot.'] = u'Пустой Слот.' config.translations[u'Are you sure you want to overwrite your save?'] = u'Вы уверены, что хотите перезаписать сохранение?' config.translations[u'Loading will lose unsaved progress.\nAre you sure you want to do this?'] = u'При загрузке не сохраненное прохождение будет утеряно.\nТочно продолжить?' config.translations[u'q'] = u'в' config.translations[u'a'] = u'о' # Переводимые строки файла common/_layout/classic_joystick_preferences.rpym config.translations[u'Not Assigned'] = u'Не Незначено' config.translations[u'Joystick Mapping'] = u'Настройка Джойстика' config.translations[u'Left'] = u'Влево' config.translations[u'Right'] = u'Вправо' config.translations[u'Up'] = u'Вверх' config.translations[u'Down'] = u'Вниз' config.translations[u'Select/Dismiss'] = u'Выбрать/Отклонить' config.translations[u'Rollback'] = u'Вернуться' config.translations[u'Hold to Skip'] = u'Удерживать для Пропуска' config.translations[u'Toggle Skip'] = u'Переключить Пропуск' config.translations[u'Hide Text'] = u'Скрыть Текст' config.translations[u'Menu'] = u'Меню' config.translations[u'Move the joystick or press a joystick button to create the mapping. Click the mouse to remove the mapping.'] = u'Нажмите кнопку джойстика чтобы создать привязку к действию. Щелкните мышкой чтобы удалить привязку.' # Переводимые строки файла common/_layout/classic_preferences_common.rpym config.translations[u'Test'] = u'Тест' config.translations[u'Window'] = u'Окнонный' config.translations[u'Fullscreen'] = u'Полноэкранный' config.translations[u'All'] = u'Все' config.translations[u'Some'] = u'Некоторые' config.translations[u'None'] = u'Нет' config.translations[u'Seen Messages'] = u'Прочитанные' config.translations[u'All Messages'] = u'Все Сообщения' config.translations[u'Stop Skipping'] = u'Прекратить Пропуск' config.translations[u'Keep Skipping'] = u'Продолжить Пропуск' # Переводимые строки файла common/_layout/classic_load_save.rpym config.translations[u'Auto'] = u'Авто' config.translations[u'Quick'] = u'Быстро' config.translations[u'Previous'] = u'Предыдущий' config.translations[u'Next'] = u'Следующий' # Переводимые строки файла common/_compat/gamemenu.rpym config.translations[u'The error message was:'] = u'Сообщение об ошибке:' config.translations[u'You may want to try saving in a different slot, or playing for a while and trying again later.'] = u'Попробуйте сохранить в другой слот или, немного поиграв, попробовать еще раз.' config.translations[u'Save Failed.'] = u'Ошибка сохранения.' # Переводимые строки файла common/_compat/preferences.rpym config.translations[u'Joystick Configuration'] = u'Настройка Джойстика' # Переводимые строки файла common/_compat/mainmenu.rpym config.translations[u'Continue Game'] = u'Продолжить Игру'

Перевод Launcher’а

Создайте файл renpy-6.8.1/launcher/translations.rpy с представленным ниже содержимым.

# Данный файл содержит список всех переведенных фраз режима "разработчика" Ren'Py. init python: # Переводимые строки файла data/new.rpy config.translations[u'Select a Template'] = u'Выберите Шаблон' config.translations[u'Please select a project to use as a template for your project.'] = u'Выберите проект, который будет использован как шаблон для вашего проекта.' config.translations[u'Project Name'] = u'Имя Проекта' config.translations[u'Type the name of your new project, and press enter.\n'] = u'Введите имя вашего нового проекта, затем нажмите Enter.\n' config.translations[u'Please enter a non-empty project name.'] = u'Имя проекта не должно быть пустым.' config.translations[u"A file or directory named '%s' already exists."] = u"Файл или папка с именем '%s' уже существует." config.translations[u'Project names must be ASCII. This is because the ZIP file format does not support non-ASCII characters in a uniform way.'] = u'Имя проекта должно быть в формате ASCII для возможности последующего сжатия в ZIP-архив' config.translations[u'Error'] = u'Ошибка' config.translations[u'Creating Project'] = u'Создание Проекта' config.translations[u'Please wait while we create the project.'] = u'Пожалуйста подождите пока проект будет создаваться.' config.translations[u'Select a Theme'] = u'Выбор Темы' config.translations[u'Please select a color theme for your project. You can always change the colors later.'] = u'Выберите цветовую схему для своего проекта. (Поздже вы в любой момент сможете ее изменить).' config.translations[u'Changing Theme'] = u'Изменение темы' config.translations[u'The options file does not seem to exist.'] = u'Файл настроек не существует.' config.translations[u'Could not modify options.rpy, perhaps it was edited too much.'] = u'Невозможно изменить options.rpy, возможно он был слишком усердно перередактирован О_о.' # Переводимые строки файла data/distribute.rpy config.translations[u"Can't Distribute"] = u"Невозможно создать дистрибутив" config.translations[u"Ren'Py is missing files required for distribution. Please download the full package from www.renpy.org."] = u"Ren'Py утерял необходимые для создания дистрибутива файлы. Пожалуйста загрузите последнюю полную версию с www.renpy.org." config.translations[u'Building Distributions'] = u'Сборка Дистрибутива.' config.translations[u"I've just performed a lint on your project. If it contains errors, you should say no and fix them.\nCheck www.renpy.org to see if updates or fixes are available.\n\nDo you want to continue?"] = u"\n\nLint проверяет проект на ошибки, При обнаружении исправьте их выбрав нет.\nПосетите www.renpy.org для проверки обновлений.\n\nХотите продолжить?" config.translations[u'Yes'] = u'Да' config.translations[u'Distributions will be built for the following platforms:'] = u'Будут собраны дистрибутивы для следующих платформ:' config.translations[u'Windows 2000+'] = u'Windows 2000+' config.translations[u'Linux x86'] = u'Linux x86' config.translations[u'Mac OS X 10.4+'] = u'Mac OS X 10.4+' config.translations[u'Is this okay?'] = u'OK?' config.translations[u'Please enter a base name for the directories making up this distribution.'] = u'Введите имя создаваемого дистрибутива.' config.translations[u"This usually should include a name and version number, like 'moonlight_walks-1.0'."] = u" Оно обычно должно включать имя и номер версии, например 'moonlight_walks-1.0'." config.translations[u'The distribution name should not be empty.'] = u'Имя дистрибутива не должно быть пустым!' config.translations[u'Distribution names must be ASCII. This is because archive file formats do not support non-ASCII characters in a uniform way.'] = u'Имя проекта должно быть в формате ASCII для возможности сжатия в ZIP-архив.' config.translations[u'Please enter a space separated list of the file extensions you do not want included in the distribution.'] = u'Введите расширения файлов, которые НЕ будут включены в дистрибутив, разделяя их пробелами.' config.translations[u'Be sure to announce your project at the Lemma Soft Forums.'] = u'Убедитесь, что вы объявили о вашем проекте на Lemma Soft Forums.' config.translations[u'Building Windows'] = u'Сборка под Windows' config.translations[u'If appropriate, please submit your game to www.renai.us.'] = u'Если Вас не затруднит, пожалуйста выложите Вашу игру на www.renai.us.' config.translations[u'Building Linux'] = u'Сборка под Linux' config.translations[u"Thank you for choosing Ren'Py."] = u"Спасибо за выбор Ren'Py!" config.translations[u'Building Mac OS X'] = u'Сборка под Mac OS X' config.translations[u'Success'] = u'Успешно!' config.translations[u'The distribution(s) have been built. Be sure to test them before release.'] = u'Дистрибутив(ы) был собран. Протестируйте его перед публикацией.' config.translations[u"Note that unpacking and repacking Mac zips and Linux tarballs on Windows isn't supported."] = u"Распаковка и перепаковка zip-архивов Mac или tar-архивов Linux под Windows не поддерживается!" config.translations[u'Return'] = u'Вернуться' # Переводимые строки файла data/launcher.rpy config.translations[u'Next Page'] = u'Следующая Страница' config.translations[u'Go to the next page of projects.'] = u'Перейти на слеующую страницу.' config.translations[u'Previous Page'] = u'Предыдущая Страница' config.translations[u'Go to the previous page of projects.'] = u'Вернуться на предыдущую страницу.' config.translations[u'Cancel'] = u'Отмена' config.translations[u'Return to the top menu.'] = u'Вернуться в основне меню.' config.translations[u'Lint in progress.'] = u'Lint проводит проверку.' config.translations[u'Lint'] = u'Lint' config.translations[u'Deleting persistent data.'] = u'Удаление повторяющихся данных.' config.translations[u'Delete Persistent'] = u'Удалить повторы' config.translations[u'What do you want to do?'] = u'С чего желаете начать?' config.translations[u'This Project'] = u'Данный Проект' config.translations[u'Launch'] = u'Запустить' config.translations[u'Starts the project running.'] = u'Запустить.' config.translations[u'Edit Script'] = u'Изменить Скрипт' config.translations[u'Edits the script files.'] = u'Изменить файлы скриптов игры.' config.translations[u'Change Theme'] = u'Выбрать Тему' config.translations[u'Changes the color theme of the project.'] = u'Изменить цветовую тему проекта.' config.translations[u'Game Directory'] = u'Папка с Игрой' config.translations[u'Opens the game directory.'] = u'Открыть папку с игрой в файловом менеджере.' config.translations[u'Tools'] = u'Инструменты' config.translations[u'Shows the tools menu.'] = u'Показать меню инструмов.' config.translations[u'Change Project'] = u'Изменить Проект' config.translations[u'Select Project'] = u'Выбрать Проект' config.translations[u'Select a project to work with.'] = u'Выбрать проект, с которым будем работать.' config.translations[u'New Project'] = u'Новый Проект' config.translations[u'Create a new project from a template.'] = u'Создать новый проект из шаблона.' config.translations[u'Documentation'] = u'Документация' config.translations[u"Read Ren'Py tutorials and manuals."] = u"советы и уроки по работе с Ren'Py." config.translations[u'Quit'] = u'Выйти' config.translations[u"Quit the Ren'Py Launcher."] = u"Выйти из Ren'Py." config.translations[u'Select a Project'] = u'Выбрать Проект' config.translations[u'Please select a project.'] = u'Выберите проект.' config.translations[u'%s has been launched.'] = u'%s был запущен.' config.translations[u'Launching the editor failed. You may need Java, which can be downloaded for free from java.com.'] = u'Не удается запустить редактор. Возможно в Вашей системе не установлена Java. Java можно бесплатно скачать на java.com.' config.translations[u'Launched editor with %d script files.'] = u'Запущен редактор с %d файлами скриптов.' config.translations[u'Opening the game directory is not supported on this platform.\n%s'] = u'Открытие папки с игрой на данной платформе не поддерживается.\n%s' config.translations[u'Opening game directory:\n%s'] = u'Открывается папка:\n%s' config.translations[u'Please choose a tool you want to use with this project.'] = u'Выберите инструмент, который хотите применить к данному проекту..' config.translations[u'Anytime'] = u'В любое время' config.translations[u'Check Script (Lint)'] = u'Тест Скрипта (Lint)' config.translations[u"Checks the game's script for likely errors. This should be run before releasing."] = u"Скрипт игры проверяется на наиболее распространённые ошибки. Обязательно выполните проверку перед публикацией игры." config.translations[u"Deletes the game's persistent data."] = u"Удаление повторяющихся данных в игре." config.translations[u'Release Day'] = u'Перед публикацией' config.translations[u'Add From to Calls'] = u"Добавить адресантов к командам вызова" config.translations[u'Adds a from clause to each of the call statements in your script.'] = u'Добавляет приписку адресанта (from) к каждой команде вызова (call) в скрипте.' config.translations[u'Archive Files'] = u'Упаковать Файлы' config.translations[u'Archive files found under the game and archived directories.'] = u'Упаковать в архив файлы в папке с игрой.' config.translations[u'Build Distributions'] = u'Выпуск Игры' config.translations[u"Build distributions for the platforms supported by Ren'Py."] = u"Создаёт готовые к распространению архивы с игрой для всех платформ, поддерживаемых Ren'Py." config.translations[u'Back'] = u'Назад' config.translations[u'Goes back to the top menu.'] = u'Вернуться в основное меню.' config.translations[u'A lint report should appear shortly.'] = u'Генерируется отчет lint.' config.translations[u'Archiving Files'] = u'Архивирование Файлов' config.translations[u'Please enter a space separated list of the file patterns you want archived.'] = u'Введите расширения файлов, которые будут заархивированы, разделяя их пробелами.' config.translations[u'Please enter the name of the archive file, without the .rpa extension.'] = u'Введите имя файла архива без расширения .rpa' config.translations[u'Please wait while we archive files.'] = u'Пожалуйста подождите пока архивируются файлы.' config.translations[u'The files have been added to the archive, and moved into the archived directory.'] = u'Файлы были добавлены в архив и перемещены в папку archived.' config.translations[u'Making Backup'] = u'Резервирование Файлов' config.translations[u'Please wait while we make a backup.'] = u'Пожалуйста подождите пока файлы резервируются.' config.translations[u'The backup was placed into %s.'] = u'Резервная копия была помещена в папку %s.' config.translations[u'Please wait while we add from clauses to call statements.'] = u'Пожалуйста, дождитесь окончания операции добавления адресатов к командам вызова.' config.translations[u'Done adding from clauses to call statements. You may want to remove the .bak files created.'] = u'Завершено добавление адресантов к командам вызова. Если желаете, можете удалить созданные в процессе резервные (.bak) файлы.' config.translations[u'Done deleting persistent data.'] = u'Удаление повторяющихся данных завершено.' config.translations[u"Now showing the Ren'Py documentation in your web browser."] = u"Сейчас в Вашем интернет-браузере откроется документация по Ren'Py."

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *