Как прописывать действия в процентном соотношении.



 

"У тебя 35% что ты ничего не поймешь из этой книги"

"У тебя 25% что что ты может быть и поймешь что тут пишут"

"У тебя 40% что ты все поймешь"

 

$ sila= renpy.random.randint(1, 100)

if sila <35:

   "Я тугодум и я ничего не понял"

   jump povtorit_vse

elif sila < 60:

   "Я почти понял о чем тут речь"

else:

   "Я все понял"

Для 1 категории разьясняю, о чем тут написано. Мы задали переменной диапазон от 1 и до 100 ( $ sila= renpy.random.randint(1, 100) ) и мы сделали еще условия, при которых - if sila <35: - будет воспроизведенена в значениях от 1 и до 35 т.е. 35%, elif sila < 60: в значениях от 35 до 60 т.е. 25 %, else: будет от 60 и до 100 т.е. 40 %. Тут  соответственно можно логически понять о чем речь

 

Renpy . random . random ()

Генерация числа от 0 и до 1 (там 0.35 и т.д) применяется зачастую в прописях координат

 

 

Пример

screen main_menu:

 

# Это заменяет другие меню.

tag menu

# Фон главного меню.

window:

   style "mm_root"

# Кнопки главного меню.

frame:

   style_group "mm"

   xalign renpy.random.random()

   yalign renpy.random.random()

   has vbox

   textbutton _("Начать игру") action Start()

   textbutton _("Загрузить игру") action ShowMenu("load")

   textbutton _("Настройки") action ShowMenu("preferences")

   textbutton _("Справка") action Help()

   textbutton _("Выход") action Quit(confirm=False)

 

init -2 python:

 

# Сделать все кнопки главного меню одноразмерными.

style.mm_button.size_group = "mm"

И получили плавающее главное меню.

 

Renpy.random.shuffle

Случайное воспроизведение музыки

$ playlist = ["song1.mp3", "song2.mp3", "song3.mp3", "song4.mp3", "song5.mp3"]

$ renpy.random.shuffle(playlist)

play music playlist fadeout 1.0 fadein 1.0

Таймеры.

 

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

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

Числовой таймер

screen battletime:

timer 0.1 repeat True action If(time > 0, true=SetVariable('time', time - 0.1), false = [Hide('battletime'), Jump(timerjump)])

if time <=3:

text _("{color=#f00}{size=72} [time]") xalign 0.5 yalign 0.2### на 3 секунде оно покраснеет

else:

   text _("{color=#fff}{size=72} [time]") xalign 0.5 yalign 0.2### до 3 секунды оно белое

 

label balbes:

pause 0.1

"Вот и стой у разбитого корыта"

return

 

laber start:

"Тест числ таймера"  

$ time = 5 #####Таймер всегда пишется в самом начале любой метки, если раньше написать текст а потом вызов, то будет ошибка

$ timerjump = "balbes" ###Если не успел выбрать, то перейдешь в эту метку

show screen battletime###вызываем таймер

  menu:

      "1)Поцеловать":

          "Я" "Каэда!"

          "Каэда" "Что тебе?!"

          "чмок"

        return

 

      "2)Обнять":

          "Каэда" "Убери от меня руки! {w} Я ненавижу тебя!!!"

          "Я" "Прости"

          "Мы так и простояли обнявшись. Она успокоилась и заплакала"

            return

 

Разберем что тут записали

screen battletime:– прописываем экран где мы указываем паузу( timer 0.1) включаем условия если больше 0 то будет отниматься по 0,1 секунде (If(time > 0, true=SetVariable('time', time - 0.1), ) если меньше 0 то закрывается экран с таймером (), false = [Hide('battletime'),  ) и автоматически переносимся в метку (Jump(timerjump)])) если не уложились по времени

Таймер в виде бара

 

###Картинка бара

init -5 python:

style.timebar = Style(style.default)

style.timebar.left_bar = Frame("ui/interface/timerfull.png", 0, 0)

style.timebar.right_bar = Frame("ui/interface/timerempty.png", 0, 0)

style.timebar.xmaximum = 695 # bar width

style.timebar.ymaximum = 27 # bar height   

   

 

 

screen battletime:

timer 0.1 repeat True action If(time > 0, true=SetVariable('time', time - 0.03), false = [Hide('battletime'), Jump(timerjump)])

bar:

       style "timebar"

       value time

       xalign 0.5 yalign 0.2# расположение бара

 

label balbes:

pause 0.1

"Вот и стой у разбитого корыта"

return

 

 

laber start:

"Тест бара"  

$ time = 1 #####Таймер всегда пишется в самом начале любой метки, если раньше написать текст а потом вызов, то будет ошибка

$ timerjump = "balbes" ###Если не успел выбрать, то перейдешь в эту метку

show screen battletime###вызываем таймер

  menu:

      "1)Поцеловать":

          "Я" "Каэда!"

          "Каэда" "Что тебе?!"

          "чмок"

        return

 

      "2)Обнять":

          "Каэда" "Убери от меня руки! {w} Я ненавижу тебя!!!"

          "Я" "Прости"

          "Мы так и простояли обнявшись. Она успокоилась и заплакала"

            return

 

 

Полезные плюшки (были взять с блога http://renpyfordummies.blogspot.ru ) возможно в таком виде в каком они есть не будут работать(ибо были написаны на старых версиях)

 

1) Убираем постоянное мельтешение текстового бокса

· $ _window_during_transitions = True 2)Создаем кнопку продолжить игру и текст подтвежденияДля начала сделаем запись в самом начале сценария script.rpy· label main_menu:·     call screen main_menu·  · label restart:·     call screen confirm(message=u"Точно хотите начать игру заново?", yes_action=Start(), no_action=Jump("main_menu"))· ### активацию автосохранения:· init -1 python hide:·     config.has_autosave = True Далее нам потребуется зайти в сценарий экрана, и найти там наше главное меню (использую стандартное гуи меню)и там дописать выделенные фрагменты· · screen navigation():· ·     vbox:·         style_prefix "navigation"· ·         xpos gui.navigation_xpos·         yalign 0.5· ·         spacing gui.navigation_spacing· ·         if main_menu:· ·             textbutton _("Начать игру") action Jump("restart")· ·         else:· ·             textbutton _("История") action ShowMenu("history")· ·             textbutton _("Сохранить") action ShowMenu("save")· ·         textbutton _("Продолжить игру") action FileLoad(1, confirm=False, page="auto", newest=True)·         ·         textbutton _("Загрузить игру") action ShowMenu("load")· ·         textbutton _("Настройки") action ShowMenu("preferences") Что мы тут записали:При нажатии на кнопку Начать игру мы вызываем метку рестарт, в котором высвечивается сообщение экрана уведомления(confirm – на новых, на старых - yesno_prompt ) в котором у вас уточняют хотите ли вы начать новую игру.А нажимая на кнопку Продолжить игру мы автоматически загружаем последнее авто сохранение. Благодоря тому что мы прописали активацию автосохранения, у нас загрузится наше последнее место на котором мы остановились. 5) Разные фоны для главного меню· #script.rpy:· label start:· "Смена фона в прямой зависимости от концовки."· menu:"Первыйнах.":§ $ persistent.ending = "first""Второй.":§ $ persistent.ending = "second""Вернуть основной фон.":§ $ persistent.ending = "main"· return · #screens.rpy:· screen main_menu:· # Это заменяет другие меню.·     tag menu· # Фон главного меню.·     window:style "mm_root" if persistent.ending == None:$ persistent.ending = "main"background ("images/mm-%s.jpg" % (persistent.ending))# и т.д. 6)Фон меню от времени суток (http://renpyfordummies.blogspot.ru/2015/01/blog-post.html) #окно игры – в центр экранаinit python hide: import os os.environ['SDL_VIDEO_CENTERED'] = '1' init: # свет для каждого времени суток image day = Null() image morning = "#8404" image evening = "#0484" image night = "#000b" # спрайт, фон image man = "man.png" image bg = "bg.jpg" # функция, переводящая системное время в название времени сутокinit python: import datetime def gett():   h = int(datetime.datetime.now().strftime("%H"))   res = "night" # по умолчанию ночь   # границы любого времени суток можно поменять   if (h > 6) and (h < 11):       res = "morning"   if (h >= 11) and (h <= 18):       res = "day"   if (h > 18) and (h < 23):       res = "evening"   return res# чтобы фон меню зависел от текущего времени суток,# в раздел main_menu в screens.rpy добавить строку:# add "%s" % (gett()) # пример для игры, а не для системных часовlabel start: scene bg show man show morning as light "Утро."     show day as light "День." show evening as light "Вечер." show night as light "Ночь." return7) Музыка в меню от времени суток (http://renpyfordummies.blogspot.ru/2017/01/blog-post.html) init python: # окно игры – в центр экрана import os os.environ['SDL_VIDEO_CENTERED'] = '1' # функция переводит текущее время в название времени суток import datetime def get_t():   h = int(datetime.datetime.now().strftime("%H"))   res = "night" # по умолчанию ночь   # границы любого времени суток можно поменять   if (h > 6) and (h < 11):       res = "morning"   if (h >= 11) and (h <= 18):       res = "day"   if (h > 18) and (h < 23):       res = "evening"   return res last_t = None # функция меняет музыку и освещение в меню # в зависимости от времени суток def change_mus():   global last_t   if last_t != get_t():       last_t = get_t()       # перезапускаем отрисовку меню       renpy.restart_interaction()       # меняем мелодию в главном меню       config.main_menu_music = last_t + ".ogg"       if renpy.music.get_playing() != last_t + ".ogg":           renpy.music.play(last_t + ".ogg") # функцию - в action ChangeMus = renpy.curry(change_mus) # картинка для фона главного меню style.mm_root.background = "mm.jpg" # в main_menu после style "mm_root": # timer .05 repeat True action ChangeMus() # if last_t:   # add last_t init: # фильтры для освещения image morning = "#8404" image day = "#0000" image evening = "#0484" image night = "#000b" # Игра начинается здесь.label start:"Вы создали новую игру Ren'Py." return 8) Простой способ смены суток (http://renpyfordummies.blogspot.ru/2015/02/blog-post.html)init: image man = "man.png" image bg = "bg.jpg" $ dt = "утро " screen daytime: if dt == "утро " : add "#8404" if dt == "вечер " : add "#0484" if dt == "ночь " : add "#000b" label start: show screen daytime scene bg show man "Сейчас – [dt]." $ dt = "день " "Сейчас – [dt]." $ dt = "вечер" "Сейчас – [dt]." $ dt = "ночь" "Сейчас – [dt]." return

10) Своё поле ввода с кнопками «OK» и «Cancel»

(http://renpyfordummies.blogspot.ru/2015/06/ok-cancel-script.html)

своё текстовое окно ввода с кнопками «OK» и «Cancel»# файл script.rpy init python: # для работы функции, текст вводимый в поле current_input_text = "" # фон для окошка с полем ввода (может быть масштабируемой картинкой типа Frame("bg edit", 16, 16)) i_frame = Frame("#0008", 0, 0) # то же для полосы заголовка i_caption = Frame("#0028", 0, 0) # отступ снизу от поля ввода i_vspace = 8 # ширина и высота окошка для поля ввода i_width, i_height = 400, 160 # размер текста для надписей (не для вводимого текста) i_size = 24 # а размер текста в поле ввода задается в параметрах input(***, size=26) # функция вызова поля ввода с кнопками ок и отмена. пример: # $ s = input("Введите имя:", default="Аноним", size=26, color="#8a8", length=10) # возвращает либо введенный текст, либо None (при нажатии Отмены или ESCAPE) def input(prompt=None, **args):   global current_input_text   if default is None:       current_input_text = ""   else:       current_input_text = default   if renpy.call_screen("my_input", prompt, **args):       return current_input_text   return None def f_input(newstr):   global current_input_text   current_input_text = newstr # экран ввода с кнопками ок и отменаscreen my_input(prompt=None, **args): modal True key "input_enter" action Return(True) key "K_ESCAPE" action Return(False) # рамка в центре экрана frame:   align (.5, .5)   background i_frame   xminimum i_width yminimum i_height   xmaximum i_width ymaximum i_height   button:       yalign .0       background i_caption       xfill True       action []       # заголовок       if prompt:           text prompt xalign .5 size i_size       else:           text " " xalign .5 size i_size   # поле ввода и кнопки   vbox:       align (.5, .65) # поле и надписи по центру рамки       add Input(changed=f_input, button=renpy.get_widget("my_input", prompt), **args) xalign .5       add Null(1, i_vspace)       hbox xalign .5:           textbutton _("OK") xalign .5 action Return(True) text_size i_size           textbutton _("Отмена") xalign .5 action Return(False) text_size i_size label start: scene expression "#DEF" if input("Пароль по-эльфийски", length=10, size=32) == "Дэр пароль":   "Правильно" else:   "Неправильно"return

12) Картинки в кнопках выбора

(http://renpyfordummies.blogspot.ru/2015/09/blog-post.html)

init -2 python: # автоматическое объявление картинок config.automatic_images_minimum_components = 1 config.automatic_images = [' ', '_', '/'] config.automatic_images_strip = ['images'] init: # пустая картинка image icn empty = Null(48, 48) init python: # отступы для кнопок выбора pad = 8 # выравнивание текста кнопки выбора по умолчанию default_align = .0 # по центру → .5 style.menu_choice_button.left_padding = pad style.menu_choice_button.right_padding = pad style.menu_choice_button.top_padding = pad style.menu_choice_button.bottom_padding = pad # вспомогательные функции для вырезания имен картинок def get_left(s, divider = "|"):   res = s   tmp = s.split(divider)   if len(tmp) > 1:       res = tmp[0]   return res def get_right(s, divider = "|"):   res = ""   tmp = s.split(divider)   if len(tmp) > 1:       res = tmp[1]   return res def get_align(s, divider = "|"):   res = default_align   tmp = s.split(divider)   if len(tmp) > 2:       res = float(tmp[2])   return res # экран меню выборов в игреscreen choice: window:   style "menu_window"   xalign 0.5   yalign 0.5   vbox:       style "menu"       spacing pad       for caption, action, chosen in items:           if action:               button:                   action action                   style "menu_choice_button"                   hbox:                       # добавление картинок при необходимости                       if get_right(caption) != "":                           text "{image=%s}" % (get_right(caption))                       hbox:                           yalign .5 # центрируем текст по высоте кнопки                           xfill True                           text get_left(caption) style "menu_choice" xalign get_align(caption)           else:               text caption style "menu_caption" label start: scene black menu:   "С картинкой, по центру|icn prefs|.5":       pass   "С картинкой|icn vk":       pass   "С картинкой (пустой)|icn empty":       pass   "Без картинки, по центру||.5":       pass return

13) Неубирающийся по HideInterface() экран

Допустим, мы захотели как-то оформить интерфейс игры. Добавить экран с какими-то элементами. Но при нажатии на кнопку 'h' все экраны прячутся, в том числе и тот, что прятаться не должен. Чтобы этого избежать можно размещать неубирающийся экран на отдельном слое.

(http://renpyfordummies.blogspot.ru/2016/02/hideinterface.html)

 

init -1: # список слоев. если наш tvframe поставить в другое место, # то не сработает распознавание экрана настроек. # а так наш экран не будет исчезать при нажатии 'h' $ config.layers = ["master", "transient", "tvframe", "screens", "overlay"] # экран с кинескопом и помехамиscreen frm: # выводится, если это игра, но не экран настроек if not ("preferences" in renpy.current_screen().screen_name):   add "bg frame" # Игра начинается здесь.label start: show screen frm(_layer="tvframe")

 

 

14) Динамический фон

Работая над новеллой «Сателлит», я столкнулся с такой проблемой. У меня был динамический фон – плывущие по небу облака и движущийся немного с другой скоростью пейзаж. Всё было замечательно, пока по экрану не начали двигаться спрайты. По завершении движения или при уничтожении спрайта Renpy перерисовывает фон. А значит, анимация запускается заново. Происходит рывок. Допустим тучки прошли только треть пути, и тут их возвращают на исходную. Выглядит это очень некрасиво. Но чтобы фон не перерисовывался, его можно засунуть в экран, который будет выводиться прямо поверх фона, но под спрайтами. Как это сделать, видно из кода ниже.

(http://renpyfordummies.blogspot.ru/2016/02/blog-post_24.html)

init -3 python: # окно игры в центре экрана import os os.environ['SDL_VIDEO_CENTERED'] = '1' # автоматическое объявление изображений config.automatic_images_minimum_components = 1 config.automatic_images = [' ', '_', '/'] config.automatic_images_strip = ['images']init: # трансформация для перемещения фона transform _moveleft(delay=7.5):   xalign 1.0   linear delay xalign 0.0   repeat # экран с фономscreen scr_bg: add "sky" at _moveleft(15) add "solt" at _moveleft label start: scene black # показать фон show screen scr_bg(_layer="master") with dissolve # движение спрайта show mtt at truecenter with easeinright pause .25 hide mtt with easeoutleft # спрятать фон $ renpy.hide_screen("scr_bg", layer="master") with dissolve return

 

15) Скролл любого, даже не бесшовного фона
(http://renpyfordummies.blogspot.ru/2016/02/blog-post.html)

 

# как заскроллить с произвольной скоростью любой фон# и при этом сделать его бесшовным?# очень просто: отзеркалить и состыковать одинаковыми сторонами# пример для движения влевоinit: image sky = "images/sky.jpg" # трансформации для перемещения и отзеркаливания transform scroll_in(delay = 10.0):   xpos config.screen_width xzoom -1.0   linear delay xpos 0   pause delay   repeat transform scroll_in2(delay = 10.0):   xpos config.screen_width   pause delay   linear delay xpos 0   repeat transform scroll_out(delay = 10.0):   xpos 0   linear delay xpos -config.screen_width   pause delay   repeat transform scroll_out2(delay = 10.0):   xpos config.screen_width   pause delay   xpos 0 xzoom -1.0   linear delay xpos -config.screen_width   repeatinit python: # функция объединаяет трансформации # выводит на экран     def _scroll(img, effect = None, delay = 10.0):   renpy.show(img + "1", what = ImageReference(img), at_list = [scroll_in(delay)])   renpy.show(img + "2", what = ImageReference(img), at_list = [scroll_out(delay)])   renpy.show(img + "3", what = ImageReference(img), at_list = [scroll_in2(delay)])   renpy.show(img + "4", what = ImageReference(img), at_list = [scroll_out2(delay)])   renpy.with_statement(effect) def _hide(img, effect = None):    renpy.hide(img + "1")   renpy.hide(img + "2")   renpy.hide(img + "3")   renpy.hide(img + "4")   renpy.with_statement(effect)# всё, теперь можно в любом месте скрипта# одной строкой отображать движущийся бесшовный фонlabel start: scene black # отображаем (параметры можно не указывать) $ _scroll("sky", Dissolve(2.0), 15) pause # наслаждаемся облаками # а теперь прячем наши бегущие картинки $ _hide("sky", Dissolve(2.0)) pause .5 return

16) Что-то типа чит-кодов

(http://renpyfordummies.blogspot.ru/2016/03/blog-post_18.html)

init python: # функции из файла 7dots.rpy images_auto() window_center() money = 100 # обводка style.default.outlines = [(2, "#0008", 0, 0), (1, "#0008", 0, 0)] # для хранения экранов screens = [] # вызов скрипта из экрана def call_input():   global screens   screens = renpy.current_screen().screen_name   # сам вызов, он очищает экран   renpy.call_in_new_context("my_input") CallInput = renpy.curry(call_input) # этот экран ждет нажатия кнопки табуляции screen cheat: key "K_TAB" action CallInput() # индикатор денюжек frame align(.95, .05) background "#0008":   text "$[money]" color "#dd4" size 48 # ввод кода и обработка результатовlabel my_input: # показать спрятанные ренпаем экраны python:   for i in screens[-1:]:       renpy.show_screen(i) # ввод данных (можно через renpy.input) $ res = input("Введите код:", length=4) # обработка результатов if res == "1234":   $ money += 100   # сохранение переменных и обновление экрана   $ renpy.retain_after_load()   $ renpy.restart_interaction()   centered "Правильно. Держите ещё 100 денег." elif not res:   centered "Нажата «Отмена»." else:   centered "Код неверный." return # Игра начинается здесь.label start: scene bg show neko with dissolve # показать экран, который отлавливает кнопку чит-кода show screen cheat "Нажмите TAB для ввода чит-кода. И введите «1234»." "Игра окончена."return

17) Как заставить курсор меняться при наведении на нужную кнопку.

(http://renpyfordummies.blogspot.ru/2016/03/blog-post_8.html)

init: $ config.mouse = {"default" : [("images/cursorarrow.png", 0, 0)],   "hand" : [("images/cursorhand.png", 2, 8)],   "finger" : [("images/cursorfinger.png", 2, 2)]} screen Test: vbox:   align (.5, .35)   textbutton _("Палец"):       xminimum 300       mouse "finger"       action NullAction()   textbutton _("Рука"):       xminimum 300       mouse "hand"       action NullAction() label start: scene expression "#001" show screen Test "Пример с наведением курсора на кнопку."return

18) Несколько текстбоксов

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

  • На экране может быть любое количество диалогов
  • Позиция и ширина/высота окошек определяются автоматически
  • Настраивается внешний вид диалога, отступы, фон
  • На экране может не отображаться основной текстбокс
  • Диалоги не исчезнут при нажатии «h»
  • При автоматическом создании файла перевода, текст диалогов переводится

(http://renpyfordummies.blogspot.ru/2016/03/blog-post.html)

init -3 python: # окно игры в центре экрана import os os.environ['SDL_VIDEO_CENTERED'] = '1' # автоматическое объявление изображений config.automatic_images_minimum_components = 1 config.automatic_images = [' ', '_', '/'] config.automatic_images_strip = ['images'] init python: # сначала оформим основной текстбокс: # шрифт игры style.default.font = "anime.ttf" # красивые толстенькие кнопки в игре style.button.ypadding = 8 style.button.xpadding = 16 # цвет текста в текстбоксе style.say_thought.color = "#000" # отступы для текстбокса hpad = 40 vpad = 64 # фон основного окна style.window.background = Frame("frame", hpad, vpad) # минимальный размер текстбокса style.window.yminimum = 200 # а теперь сами дополнительные диалоги: # отступы текста внутри рамки текстбокса style.window.left_padding = hpad style.window.right_padding = hpad style.window.top_padding = vpad style.window.bottom_padding = vpad # список для текста в окошках whats = [""] # отступы для растягивания рамки диалогов hpad2 = 50 vpad2 = 28 # количество дополнительных окошек # т.е. количество разделителей «|» whats_count = 0 # разделитель текста диалогов divider = "|" # рубим текст на количество диалоговых окон def SplitF(txt):   global whats, whats_count   if txt:       whats = txt.split(divider)   else:       whats = [""]   whats_count = len(whats) - 1 # превращаем в action Split = renpy.curry(SplitF) # стандартный экран с текстбоксом, но с добавлением# парсера строки и распределением кусков текста по окошкамscreen say: # Умолчания для side_image и two_window default side_image = None default two_window = False # считываем данные из текстбокса on "show" action Split(what) # Решаем, нужен ли нам двухоконный или однооконный вариант. if not two_window:   # Вариант с одним окном.   window:       id "window"       if not whats[0]:           background None       vbox:           style "say_vbox"           if who:               text who id "who"           text whats[0] id "what" # выводим первое окошко else:   # Вариант с двумя окнами.   vbox:       style "say_two_window_vbox"       if who:           window:               style "say_who_window"               text who:                   id "who"       window:           id "window"           if not whats[0]:                  background None           vbox:               style "say_vbox"               text whats[0] id "what" # выводим первое окошко # Если есть изображение, отобразить его над текстом. if side_image:   add side_image else:   add SideImage() xalign 0.0 yalign 1.0 # выводим данные в дополнительные диалоговые окошки if whats_count > 0:   hbox:       for i in range(1, whats_count + 1):           if whats[i]:               # текст в окошках               frame:                   text _(whats[i]) xalign .5 color "#000"                   # ширина экрана / количество разделителей = ширина окон                   xminimum (config.screen_width / whats_count)                   xmaximum (config.screen_width / whats_count)                   # отступы для текста от краев рамки                   left_padding vpad2                   right_padding vpad2                   top_padding vpad2                   bottom_padding vpad2                   # фон окошек                   background Frame("bubble", hpad2, vpad2)           else:               # нет текста, пустой диалог, без фона               frame:                   text _("")                   xminimum (config.screen_width / whats_count)                   background None # Использовать быстрое меню. use quick_menu label start: scene bg street "Текст в основном окне." show girl1 at left with moveinleft "Текст в основном окне.|Диалог 1 (на всю ширину)" show girl2 with dissolve "Текст в основном окне.||Диалог 2\nСтрока 2|" show girl3 at right with moveinright "Текст в основном окне.

Диалог 3" "Текст в основном окне.|Диалог 1|Диалог 2\nСтрока 2|Диалог 3" hide girl1 hide girl3 with dissolve "||Без основного текста.|"return 19) Как выделить говорящего и отодвинуть молчуна (http://renpyfordummies.blogspot.ru/2016/04/blog-post_10.html) init: # на сколько увеличивать $ zo = 1.05 # за какое время $ t_delay = .25 # перемещение и изменение размера transform t_on(xa=.5, z=zo, delay=t_delay):   align (xa, 1.0) zoom 1.00001 anchor (.5, 1.0)   easein delay zoom z transform t_off(xa=.5, z=zo, delay=t_delay):   align (xa, 1.0) zoom z anchor (.5, 1.0)   easeout delay zoom 1.00001 init python: # высветление def show_on(char, xa=.5, z=zo, delay=t_delay):   renpy.show(char, at_list=[t_on(xa, z, delay)]) # затемнение def show_off(char, xa=.5, z=zo, delay=t_delay):   renpy.show(char, what=im.MatrixColor(char + ".png", im.matrix.saturation(.15)), at_list=[t_off(xa, z, delay)]) # убрать персонажа/персонажей с экрана def hide_char(*args):   for i in args:       renpy.hide(i) label start: scene bg1 "Встретились два остолопа." # пошел диалог $ show_on("boy", .33) # цветной и увеличенный тот, кто говорит $ show_off("girl", .66) # молчащего красим в серый т уменьшаем до нормальной величины "Остолоп" "...А я говорю такой: «Оппа!»" $ show_off("boy", .33) $ show_on("girl", .66) "Остолопка" "Иди-ка поешь укропа." $ show_on("boy", .33) $ show_off("girl", .66) "Остолоп" "Ты кого назвала укропом!" $ show_on("girl", .66, zo, 1.0) "«Тяжело говорить с остолопом...»" $ hide_char("boy", "girl") with dissolve pause return   20) Изменить время выполнения with moveinleft, moveinright и т.д. (http://renpyfordummies.blogspot.ru/2016/05/with-moveinleft-moveinright.html) Можно задавать время для каждого перемещения в блоке инициализации, а можно и "на лету"   init python: mtime = 1.5 # время в пути moveinleft = MoveTransition(mtime, enter=_moveleft) moveinright = MoveTransition(mtime, enter=_moveright) moveoutleft = MoveTransition(mtime, leave=_moveleft) moveoutright = MoveTransition(mtime, leave=_moveright) init: image t = Text("{size=128}@") label start: show t with moveinleft hide t with moveoutright show t with moveinright # а можно прямо так, если нужно поменять "время в пути" на лету: hide t with MoveTransition(2.0, leave=_moveright)

Return


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

 

init:

$ define.move_transitions('move', 2.0)

 

Вызов call из экрана screen

Чтобы не порушить всю адресацию и прочие неважные нам детальки, в Renpy нельзя из экрана делать call (переход на метку с последующим возвратом). Можно перейти на метку в новом контексте, но тогда Renpy спрячет все экраны screen. Это пример того, как можно организовать call по кнопке и отобразить спрятанные экраны, словно их и не прятали. Но кнопку, по которой мы прыгнули на метку, лучше спрятать. Или заменить кнопкой возвращения назад

(http://renpyfordummies.blogspot.ru/2016/03/call-screen.html)

# чтобы вызвать локацию кнопкой на экране screen,# нужно вызывать в ее в новом контексте.# то есть открывается как бы другая игра.# и прячутся все прежние экраны. # вот только при сохранении игры, запоминается только место,# откуда был вызван первый call, словно все return уже сработали# поэтому возможность сохранения лучше отключить# итого: способ работает только для всяких менюшек,# но не для ветвления сюжетаinit python: # стек для хранения состояния экранов до вызова call screens = [] # действие по кнопке ESC gamemenu = config.game_menu_action # добавить очередной список экранов def s_push(item):   global screens   screens.append(item) # извлечь последний список экранов def s_pop():   global screens   if len(screens) > 0:       return screens.pop()   return [] # стартовое количество денег для тестирования money = 10 # флаг вызова локации в новом контексте is_call = False # из экрана нельзя выполнить обычный call label # создадим его аналог class MyCall(Action):   def __init__(self, label, *args, **kwargs):       self.label = label       self.args = args       self.kwargs = kwargs   def __call__(self):       global screens, is_call       # отключаем ESC       config.game_menu_action = NullAction()       # запоминаем экраны       s_push(renpy.current_screen().screen_name)       # включаем флаг вызова нового контекста (чтобы спрятать кнопку)       is_call = True       # вызываем локацию в новом контексте       renpy.call_in_new_context(self.label, *self.args, **self.kwargs) # функция для восстановления экранов в новом контексте def show_screens():   for i in screens[-1:]:       renpy.show_screen(i) # функция для возвращениея из локации в новом контексте def myreturn():   global is_call   # спрятать экраны   for i in s_pop():       renpy.hide_screen(i)   # снять флаг новой локации, чтобы кнопка ее вызова снова появилась   is_call = len(screens) > 0   if not is_call:       config.game_menu_action = gamemenu   # сохранение данных игры   renpy.retain_after_load()   Return()() # чтобы можно было привязать к копке, например MyReturn = renpy.curry(myreturn) # экран из которого можно выполнить callscreen test: text _(str(money) + " денег") align(.05, .05) # кнопку показываем лишь, если не выполнен call по ее нажатию if not is_call:   # кнопка, которая выполняет аналог call label   textbutton _("Чит") align(.95, .05) action MyCall("menu1") else:   # вызов call из метки, которая уже вызвана с помощью call   textbutton _("Хинт") align(.95, .05) action MyCall("hnt") label start: show expression "images/bg.jpg" show screen test "Вы создали новую игру Ren'Py." "Добавьте сюжет, изображения и музыку и отправьте её в мир!" return # другая локация, из которой можно вернуться в то же место игры# при желании можно передавать параметры при вызове# тогда, вызывать например так можно: ... action MyCall("menu1", plus=100)label menu1(plus=10): # отобразить все экраны, спрятанные при вызове локации в новом контексте $ show_screens() # собственно какие-то действия $ loop1 = True # зацикливаем до нажатия 3-й кнопки while loop1:   menu:       "+[plus]":           $ money += plus       "-[plus]":           $ money -= plus       "Вернуться":           $ loop1 = False # возвращаемся туда, откуда пришли, восстанавливая прежнее положение дел # вместо return $ MyReturn()() return label hnt: scene black centered "Подсказка: это вложенный вызов call из другого call." $ MyReturn()() return

 

22)  Информационный экран, пополняемый

init python: # при первом запуске игры создается пустой список "открытий" if persistent.pages is None:   persistent.pages = [] # номер текущей страницы page = 0# экран для отображения открытых страничекscreen scrPages: # рамка для страницы frame:   align (.5, .2) # расположение   # размеры   xminimum 500 xmaximum 500   yminimum 400 ymaximum 400   background "#0028" # фон   vbox:       spacing 16       # контейнер с кнопками управления страницами       hbox:           xfill True           # кнопка, которая листает страницы назад (с проверкой на границы)           # SensitiveIf делает кнопку активной при выполнении условия           textbutton _("«") align(.0, .0) action [SensitiveIf(page > 0), SetVariable("page", page - 1)]           text str(page + 1) + " из " + str(len(persistent.pages)) align(.5, .0)           # кнопка, которая листает страницы вперед (с проверкой на границы)           textbutton _("»") align(1.0, .0) action [SensitiveIf(page < len(persistent.pages) - 1), SetVariable("page", page + 1)]       # если текущая страница доступна, то выводим ее       if page >= 0 and page < len(persistent.pages):           $ title, txt, img = persistent.pages[page]           # горизонтальный контейнер, чтобы картинка была слева           hbox:               vbox:                   # картинка                   xminimum 200 xmaximum 200                   # если она есть, то выводим                   if img:                       add img align(.5, .2)               # вертикальный контейнер для текста               vbox:                   xfill True yalign .1                   # расстояние между объектами в контейнере                   spacing 16                   # заголовок страницы                   text title xalign .5                   # текст страницы                   text txt xfill True label start: "Для начала покажем экран со страницами. При первом запуске пустой." show screen scrPages "Добавим одну страницу." $ persistent.pages.append(("Страница 1", "Текст страницы. Просто любой текст для того, чтобы показать пример.", "image1")) "А теперь добавим еще пару страниц." $ persistent.pages.append(("Страница 2", "Текст второй страницы. И снова просто любой текст для того, чтобы показать пример.", "image2")) $ persistent.pages.append(("Страница 3", "Текст второй страницы. И снова просто любой текст для того, чтобы показать пример. Только в этот раз без картинки.", "")) "Теперь их можно полистать." hide screen scrPages "Сеанс окончен. Всем спасибо." menu:   "Очистить список страниц?"   "Да":       # эта строка очищает данные в списке страниц       $ persistent.pages = []       # скорее всего для этого будет использоваться кнопка       # textbutton _("Очистить") action SetField(persistent, "pages", [])   "Нет":       pass return

23) Как вывести на экран время, проведенное в игре

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

 

init python: import datetime # время старта текущей сессии игры = время последней проверки persistent.game_last_time = datetime.datetime.now() # общее время в игре в секундах if persistent.gametime is None:   persistent.gametime = 0 # функция для отображения текущего общего времени в игре def show_gametime(st, at):   # сколько прошло со времени последней проверки   t = datetime.datetime.now()   dt = t - persistent.game_last_time   # запоминаем текущее время, как время последней проверки   persistent.game_last_time = t   # суммируем время в игре со временем с последней проверки   persistent.gametime += dt.total_seconds() # в секундах   # переводим секунды в часы, минуты, секунды   minutes, seconds = divmod(int(persistent.gametime), 60)   hours, minutes = divmod(minutes, 60)   # переводим текст в изображение   # с форматированием (добавлением нулей, если число не двузначное)   img = Text("%0*d:%0*d:%0*d" % (2, hours, 2, minutes, 2, seconds))   # на выходе изображение со временем   return img, .1init: # привязываем функцию к динамическому изображению, # чтобы счетчик тикал без обновления экранов image gametime = DynamicDisplayable(show_gametime) screen scr_game_time: # эту же строку можно добавить и в главное меню: add "gametime" align(.95, .05) # для сброса времени в игре:# $ persistent.gametime = 0# или привязать к кнопке:# textbutton _("Сброс времени") action SetField(persistent, "gametime", 0) # Игра начинается здесь.label start: show screen scr_game_time "Текст игры."return

24) Добавить в настройки выбор курсора

( http://renpyfordummies.blogspot.ru/2016/06/blog-post.html )

init python: # функция для смены курсора # курсоры должны лежать в папке images # cur0 - имя для системного курсора def cursor(name = "cur0", x=0, y=0):   if name != "cur0":       persistent.cur = name       persistent.cx = 0       persistent.cy = 0       config.mouse = {'default' : [('images/' + name + '.png', x, y)]}   else:       config.mouse = None # превращаем функцию в action, # чтобы можно было привязать, например, к нажатию кнопок: # action Cursor("cur0", 2, 4) Cursor = renpy.curry(cursor) # показать/скрыть меню курсоров cur_choo = False # при первом запуске ставим курсор по умолчанию if persistent.cur is None:   persistent.cur = "cur0"   persistent.cx = 0   persistent.cy = 0 # при каждом запуске ставим последний выбранный курсор cursor(persistent.cur, persistent.cx, persistent.cy) screen cursor_chooser: vbox:   align(1.0, 0.0)   # кнопка отображения/скрытия списка курсоров   imagebutton auto "cur_%s.png" focus_mask True action SetVariable("cur_choo", not cur_choo) xalign 1.0   # кнопки для смены курсора на палец   if cur_choo:       textbutton _("{image=cur0.png}") action Cursor("cur0")       textbutton _("{image=cur1.png}") action Cursor("cur1", 2, 2)       textbutton _("{image=cur2.png}") action Cursor("cur2")       textbutton _("{image=cur3.png}") action Cursor("cur3")       textbutton _("{image=cur4.png}") action Cursor("cur4", 3)       textbutton _("{image=cur5.png}") action Cursor("cur5", 3)       textbutton _("{image=cur6.png}") action Cursor("cur6") label start: # показать экран выбора курсора show screen cursor_chooser "Нажмите на кнопку в углу и выберите курсор." "При следующем запуске курсор сохранится." return

 

25)Рандомные мерцающие звезды

Чтобы использовать функцию, нужно закинуть файл blinkinstars.rpy в папку game проекта. В директории images должны быть star.png и bg_sky.jpg (либо свои файлы - всё настраивается). Можно указать регион, в котором появятся звезды (левый верхний и правый нижний углы), также можно указать количество звезд. Полученный файл можно использовать и в скрипте. Например, так: scene mmbg

# код файла blinkinstars.rpyinit -2: # мерцание transform sblink(t=1.0, frm=.0, z=1.0):   alpha frm*.5+.5 zoom z rotate renpy.random.randint(0, 360)   linear t*.5*(1.0-frm) alpha 1.0   linear t*.5 alpha .5   linear t*.5*frm alpha frm*.5+.5   repeat init -1 python: # автоматическое объявление config.automatic_images_minimum_components = 1 config.automatic_images = [' ', '_', '/'] config.automatic_images_strip = ["images"] # в папке images должна лежать картинка star.png # функция, приклеивающая к фону несколько мерцающих звездочек def BlinkinStars(star_count=20, bg = "black", region=None, **properties):   sw, sh = (config.screen_width, config.screen_height)   if region is None:       region = (0, 0, sw, sh)   # регион, в пределах которого будут размещены звезды   # (можно не задавать, тогда на весь экран)   r0x, r0y, r1x, r1y = region   # при необходимости добавляем фон   if bg is None:       data = [(sw, sh)]   else:       data = [(sw, sh), (0, 0), bg]               # мерцающие (несинхронно!) звезды   for i in range(star_count):       frm = renpy.random.random() # начало мерцания       stm = .5+renpy.random.random()*1.5 # время мерцания (0.5..2)       # позиция       y = renpy.random.randint(r0y, r1y)       x = renpy.random.randint(r0x, r1x)       szoom = renpy.random.random() # размер звездочки (0..1)       # добавляем звездочку       iname = "tmpimg" + str(i)       renpy.image(iname, At("star", sblink(stm, frm, szoom)))       data.extend([(x, y), iname])   return LiveComposite(*data) init: image mmbg = BlinkinStars(30, "bg sky") $ style.mm_root.background = "mmbg" $ style.gm_root.background = "mmbg"

 

26) Много полезного в 1 модуле

http://renpyfordummies.blogspot.ru/2017/02/blog-post_19.html

# автор: 7dots

# дата: февраль 2017

# описание:

# модуль содержит несколько полезных функций,

# которые я часто использую в своих проектах

# лицензия: cc by-sa

# свободное использование при указании авторства

# https://creativecommons.org/licenses/by-sa/3.0/deed.ru

 

init -999 python:

# окно игры в центре экрана (вызывается из init)

def window_center():

   import os

   os.environ['SDL_VIDEO_CENTERED'] = '1'

 

# автоматическое объявление изображений (вызывается из init)

def images_auto(folders=["images", "gui"]):

   config.automatic_images_minimum_components = 1

   config.automatic_images = [' ', '_', '/']

   config.automatic_images_strip = folders

 

# сменить размер шрифта в игре

# вызывать из init -1 python, не раньше

def font_size(say=26, who=None, prf=None, mm=None):

   style.say_dialogue.size = say # текст в текстбоксе

   style.say_thought.size = say # текст в текстбоксе

   if not who is None:

       style.say_label.size = who # имя персонажа

   if not prf is None:

       # интерфейс (настройки и сохранения)

       style.pref_label_text.size = prf

       style.pref_button_text.size = prf

       style.small_button_text.size = prf

       style.large_button_text.size = prf

       style.file_picker_text.size = prf

       style.file_picker_button_text.size = prf

       style.file_picker_nav_button_text.size = prf

       style.button_text.size = prf # текст на кнопках

       style.label_text.size = prf # надписи

   if not mm is None:

       style.mm_button_text.size = mm # кнопки главного меню

   # применяем изменения

   style.rebuild()

 

# узнать текущие размеры изображения типа displayable

# например, после масштабирования и других операций

# не работает в разделе init

def get_size(displayable):

   return renpy.render(renpy.easy.displayable(displayable), 0, 0, 0, 0).get_size()

def get_width(displayable):

   return get_size(displayable)[0]

def get_height(displayable):

   return get_size(displayable)[1]

 

# если это не список, то сделать единственным элементом списка

def make_list(param):

   if param is None:

       return None

   if not isinstance(param, list):

       param = [param]

   return param

 

# эффект dissolve, но с учетом прозрачности спрайта. пример:

# with diss

diss = Dissolve(.1, alpha=True)

diss25 = Dissolve(.25, alpha=True)

 

# эффект вспышки нужного цвета для смены фонов. пример:

# with flash("#822")

def flash(color="#fff"):

   return Fade(.25, 0, .75, color=color)

 

# создание анимации из уже объявленных изображений,

# с обратным ходом и эффектами при смене кадров

# описание функции Ani:

# например есть уже объявленные кадры "neko%s",

# где %s - числа от 1 до 5, тогда объявляем анимацию так:

# image neko = Ani("neko", 5, 0.5, reverse = False)

# где:

# img_name - имя изображения без номера (например, "neko")

# frames - количество кадров

 # delay - пауза между кадрами в секундах

# loop - зациклить анимацию (по умолчанию включено)

# reverse - нужно ли проигрывание анимации в обратную сторону

# effect - эффект для смены кадров. например, Dissolve(.1, alpha=True)

# start - с какой цифры начинать отсчет кадров

# zoom - масштаб

# alpha - прозрачность

def Ani(img_name, frames, delay=.1, loop=True, reverse=False, effect=diss, start=1, zoom=1.0001, alpha=1.0, **properties):

   if img_name:

       args = []

       # перебираем все кадры анимации

       for i in range(start, start + frames):

           # старая версия - args.append(renpy.display.im.image(img_name + str(i) + ".png"))

           args.append(Transform(renpy.easy.displayable(img_name + str(i)), zoom=zoom, alpha=alpha))

           if reverse or loop or (i < start + frames - 1):

               args.append(delay)

               # добавляем эффект для смены кадров

               args.append(effect)

       if reverse: # обратная анимация, если нужна

           for i in range(start + frames - 2, start, -1):

               args.append(Transform(renpy.easy.displayable(img_name + str(i)), zoom=zoom, alpha=alpha))

               if loop or (i > start + 1):

                   args.append(delay)

                   args.append(effect)

       return anim.TransitionAnimation(*args, **properties)

   return None

 

# показать фон с именем bg указанного цвета color

def bg(color="#000", bg="bg"):

   renpy.scene()

   renpy.show(bg, what=renpy.easy.displayable(color))

 

# меняем стандартное время всех или некоторых эффектов для появления/исчезновения спрайтов

def move_time(delay=.5, effects=["move", "ease"]):

   effects = make_list(effects)

   for i in effects:

       define.move_transitions(i, delay)

 

# для цифровых часиков (не менять, не вызывать)

clock_properties = None

def show_digital_clock(st, at):

   import datetime

   cur_time = datetime.datetime.now().strftime("%H:%M:%S")

   img = Text(cur_time, **clock_properties)

   return img, .25

 

# создать цифровые часики с любым именем картинки (только в init!):

# $ create_clock("digital_clock", size=48, color="#fff8", outlines=[(2, "#0008", 0, 0)], align=(.05, .05))

# применение - на любом экране screen:

# add "digital_clock"

# или в виде спрайта:

# show digital_clock

def create_clock(name, **properties):

   global clock_properties

   clock_properties = properties

   renpy.image(name, DynamicDisplayable(show_digital_clock))

 

# показать экран на слое "мастер",

# чтобы он не исчезал, когда прячем интерфейс

def show_s(screen):

   renpy.show_screen(screen, _layer="master")

 

# убрать экран со слоя "мастер"

def hide_s(screen):

   renpy.show_screen(screen, layer="master")

 

# показать рамку, неубирающуюся вместе с другими экранами

# вызов: $ show_forever("имя_картинки_для_рамки")

def show_forever(forever_frame):

   renpy.show_screen("forever_screen", forever_frame, _layer="forever_screen")

 

# спрятать рамку, неубирающуюся вместе с другими экранами

def hide_forever():

   renpy.hide_screen("forever_screen", layer="forever_screen")

 

# получить английское название времени суток

# если не указывать время в часах,

# то будет взято системное время

def time_of_day(hours=None):

   if hours is None:

       hours = int(datetime.datetime.now().strftime("%H"))

   res = "night" # по умолчанию ночь

   # границы любого времени суток можно поменять

   if (hours > 6) and (hours < 11):

       res = "morning"

   if (hours >= 11) and (hours <= 18):

       res = "day"

   if (hours > 18) and (hours < 23):

       res = "evening"

   return res

 

# словарь цветов для времен суток

color_filters = {"morning": "#8404", "day": "#0000", "evening": "#0484", "night": "#000b"}

 

# получить цвет фильтра, соответствующий времени суток

def color_of_day(hours=None):

   return color_filters[time_of_day(hours)]

 

# дуйствие - продолжить игру оттуда, где закончили

# если загружать пока нечего, то кнопка неактивна

# textbutton _("Продолжить игру") action Continue()

class Continue(Action, DictEquality):

   def __call__(self):

       FileLoad(1, confirm=False, page="auto", newest=True)()

   # кликабельность кнопки

   def get_sensitive(self):

       return FileLoadable(1, page="auto")

 

# объявлена ли картинка с именем name

def has_image(name):

   for i in renpy.display.image.images:

       # такая конструкция позволяет исключить пустые теги

       if name == " ".join(" ".join(i).split()):

           return True

   return False

 

# рандомное целое число в заданных пределах

# (i_to можно не указывать, тогда максимум берется из i_from)

def rnd(i_from=0, i_to=None):

   if i_to is None:

       i_to = i_from

       i_from = 0

   return renpy.random.randint(int(i_from), int(i_to))

 

# рандомное дробное число в заданных пределах

# (f_to можно не указывать, тогда максимум берется из f_from)

def rndf(f_from=0, f_to=None):

   if f_to is None:

       f_to = f_from

       f_from = .0

   return f_from + renpy.random.random() * (f_to - f_from)

 

Import os

# получить расширение файла

def get_ext(fn):

   ext = os.path.splitext(fn)

   if len(ext) > 1:

       return ext[len(ext) - 1][1:]

   return ""

 

# отменить новое расширение ext, если расширение есть в имени файла fn

def check_ext(fn, ext):

   if get_ext(fn):

       ext = get_ext(fn)

       fn = fn[:-len(ext)-1]

   return fn, ext

 

# регистрация нового канала

def reg_channel(name, channel="sfx", loop=False):

   renpy.music.register_channel(name, mixer=channel, loop=loop)

 

# музыка

def mplay(fn, fadein=1.5, fadeout=1.5, channel="music", loop=True, ext="ogg"):

   fn, ext = check_ext(fn, ext)

   old_fn = renpy.music.get_playing()

   new_fn = "music/" + fn + "." + ext

   if old_fn != new_fn:

       renpy.play(new_fn, channel=channel, loop=loop, fadein=fadein, fadeout=fadeout)

 

# звук

def splay(fn, fadein=0, fadeout=0, channel="sound", loop=False, ext="mp3", need_check=False):

   fn, ext = check_ext(fn, ext)

   old_fn = renpy.music.get_playing()

   new_fn = "sounds/" + fn + "." + ext

   if need_check and old_fn == new_fn:

       return

   renpy.play(new_fn, channel=channel, loop=loop, fadein=fadein, fadeout=fadeout)

 

# остановить звук

def sstop(fadeout=0, channel='sound'):

   renpy.music.stop(channel=channel, fadeout=fadeout)

 

# остановить музыку

def mstop(fadeout=1.5, channel="music"):

   renpy.music.stop(channel=channel, fadeout=fadeout)

 

# регистрация одного или нескольких каналов

def reg_sfx(channels, mixer="sfx", loop=False):

   channels = make_list(channels)

   for i in channels:

       reg_channel(i, mixer, loop)

 

# воспроизведение звука на заранее зарегистрированном для этого звука канале

def sfxplay(fn, fadein=0, fadeout=0, channel=None, loop=False, ext="mp3"):

   fn, ext = check_ext(fn, ext)

   if channel is None:

       channel = fn

   splay(fn, fadein=fadein, fadeout=fadeout, channel=channel, loop=loop, ext=ext)

 

# воспроизведение зацикленного звука на заранее зарегистрированном для этого звука канале

def bgxplay(fn, fadein=1.5, fadeout=1.5, channel=None, loop=True, ext="mp3"):

   fn, ext = check_ext(fn, ext)

   if channel is None:

       channel = fn

   splay(fn, fadein=fadein, fadeout=fadeout, channel=channel, loop=loop, ext=ext)

 

# плавно остановить звук

def sfxstop(channel="sound", fadeout=1.5):

   renpy.music.stop(channel=channel, fadeout=fadeout)

 

# плавно остановить музыку

def bgxstop(channel="music", fadeout=1.5):

   renpy.music.stop(channel=channel, fadeout=fadeout)

 

# установить громкость канала в коэффициенте от громкости звуков

def bgxvolume(volume=1.0, channel="sound", delay=1.0):

   volume = _preferences.get_volume('sfx') * volume

   if volume < 0:

       volume = 0

   if volume > 1.0:

       volume = 1.0

   renpy.music.set_volume(volume, delay, channel=channel)

 

init python:

# список слоев. наш экран не будет исчезать при нажатии 'h'

config.layers = ["master", "transient", "forever_screen", "screens", "overlay"]

# нужно включить автоматические сохранения, чтобы работала Continue (подставить = True)

config.has_autosave = False

 

# для input

current_input_text = ""

 

# функция вызова поля ввода с кнопками ок и отмена. пример:

# $ s = input("Введите имя:", default="Аноним", size=26, color="#8a8", length=10)

def input(prompt=None, **args):

   global current_input_text

   if default is None:

       current_input_text = ""

   else:

       current_input_text = default

   if renpy.call_screen("my_input", prompt, **args):

       return current_input_text

   return None

 

# всё, что ниже можно не смотреть - используется функциями выше

def f_input(newstr):

   global current_input_text

   current_input_text = newstr

 

# экран ввода с кнопками ок и отмена

screen my_input(prompt=None, **args):

modal True

key "input_enter" action Return(True)

key "K_ESCAPE" action Return(False)

frame align (.5, .5):

   vbox:

       if prompt:

           frame xalign .5 background "#0004":

               text prompt xalign .5

       add Input(changed=f_input, button=renpy.get_widget("my_input", prompt), **args) xalign .5

       hbox xalign .5:

           textbutton _("OK") xalign .5 action Return(True)

           textbutton _("Отмена") xalign .5 action Return(False)

 

# экран для неубирающейся рамки

screen forever_screen (forever_frame, _layer="forever_screen"):

# выводится, если это игра, но не экран настроек

if not ("preferences" in renpy.current_screen().screen_name):

   add forever_frame

 

Листаем страницы книги

http://renpyfordummies.blogspot.ru/2017/02/blog-post.html

init -1 python: # окно игры в центре экрана import os os.environ['SDL_VIDEO_CENTERED'] = '1' # автоматическое объявление изображений config.automatic_images_minimum_components = 1 config.automatic_images = [' ', '_', '/'] config.automatic_images_strip = ['images'] style.default.font = "fonts/AnimeAceV3.ttf" style.default.size = 22 init: # положение левой страницы transform lf():   xpos .5 xanchor 1.0 yalign .5 # положение правой страницы transform rg():   xpos .5 xanchor 0.0 yalign .5 # right to center (листание справа к центру) transform r2c(delay=.25):   xpos .5 xanchor 0.0 xzoom 1.0 yalign .5   easeout delay xzoom 0.001 # center to left (листание от центра влево) transform c2l(delay=.25):   xpos .5 xanchor 1.0 xzoom .001 yalign .5   easein delay xzoom 1.0init python: # перелистывание # сначала новые страницы, затем старые # если страницу не указывать, то будет пустая def pflip(new1="pageleft", new2="pageright", old1="pageleft", old2="pageright", delay=.5):   renpy.hide("pleft")   renpy.hide("pright")   renpy.show(old1, [lf()], tag="pleft")   renpy.show(new2, [rg()], tag="pright")   renpy.show(old2, [r2c(delay*.5)], tag="plist")   renpy.pause(delay*.5)   renpy.show(new1, [c2l(delay*.5)], tag="plist")   renpy.pause(delay*.5)   renpy.show(new1, [lf()], tag="pleft")   renpy.show(new2, [rg()], tag="pright")   renpy.hide("plist") label start: scene expression "#445" show pagebook with dissolve "Сейчас полистаем книгу. Просто щелкайте по экрану." # с пустых на титульные $ pflip("page0", "page1") pause # с титула на текст $ pflip("page2", "page3", "page0", "page1") pause # снова переходим к пустым страницам $ pflip(old1="page2", old2="page3") "Остальные страницы почему-то пустые." # с пустых на пустые $ pflip() "Ну и нет смысла листать дальше." # убираем с экрана страницы и саму книгу hide pleft hide pright hide pagebook with dissolve return

 

28)Добавляем в настройки размер текста

https://yadi.sk/d/pnm13XXL35aSWN

 

# screens.rpy

# . . .

screen preferences:

tag menu

# и т.д. содержимое экрана

# . . .

# в самом конце добавляем этот код:

frame:

style_group "pref"

has vbox

label _("Размер текста %s" % (ts_min + persistent.ts))

bar value FieldValue(persistent, "ts", ts_max - ts_min)

on 'hide' action SetTS()

on 'replace' action SetTS()

 

init python:

# размеры шрифта

ts_min = 16 # от сих

ts_max = 48 # до сих

if persistent.ts is None:

persistent.ts = 0

def setts():

style.default.size = ts_min + persistent.ts

style.rebuild()

SetTS = renpy.curry(setts)

setts()

 

и пример для кнопок. это в init python:

 


def setts(ts):
__persistent.ts = ts
__style.default.size = ts
__style.rebuild()
SetTS = renpy.curry(setts)
всё, теперь можно вызывать любой кнопкой. например:
textbutton _("Мелкий шрифт") action SetTS(22)
textbutton _("Средний шрифт") action SetTS(28)
textbutton _("Крупный шрифт") action SetTS(36)

 

 

Lemma Forum

https://lemmasoft.renai.us/forums/

Крупнейший форум разработчиков новелл, тут рекламируют, предлогают свои услуги и делятся советами. Как присоединиться к данному форуму. Нажимаете кнопку регистрация, заполняете анкету, самый последний вопрос в каком году появился ренпай ответ – 2004

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


Дата добавления: 2018-10-27; просмотров: 1576; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!