Exception при вызове функции из screens.rpy
|
|
#1
Здравствуйте. Возникла проблема при написании функции на python в script.rpy, а точнее при ее вызове из screens.rpy при клике на кнопку (с помощью оператора action). Прошу совета, каким образом исправить возникшую ошибку. Далее приведу проблемные фрагменты кода: script.rpy: (здесь, собственно, описана функция)
Код init python: def Func(): renpy.jump("some_label")
screens.rpy: (и ее вызов)
Код # ... imagebutton: idle "btn" hover "btn_hover" action Func() # здесь вызываю собственную функцию
Exception:
Код While running game code: File "game/script.rpy", line 75, in script scene bg ****** with dissolve Exception: Possible infinite loop.
*75 строка - первая в вызываемом с помощью renpy.jump label'e.
Полный текст exception:
Код I'm sorry, but an uncaught exception occurred.
While running game code: File "game/script.rpy", line 75, in script scene bg ****** with dissolve Exception: Possible infinite loop.
-- Full Traceback ------------------------------------------------------------
Full traceback: File "game/script.rpy", line 75, in script scene bg ****** with dissolve File "C:\Ren'py\renpy-7.1.3-sdk\renpy\execution.py", line 58, in check_infinite_loop raise Exception("Possible infinite loop.") Exception: Possible infinite loop.
Windows-8-6.2.9200 Ren'Py 7.1.3.1092 First Project 1.0 Sun Jan 20 01:56:46 2019
При попытке заменить метод renpy.jump на renpy.notify, например так:
Код renpy.notify(u"Некоторый текст") вместо вызова ошибки происходит бесконечный вывод этого уведомления, причем еще до перехода к игре, т.е. в main menu:
 При вызове функции из script.rpy все работает нормально:
Надеюсь, что изложил суть проблемы достаточно подробно. Заранее спасибо.
Сообщение отредактировал android - Воскресенье, 20/Янв/2019, 01:22
|
#2
Вам не нужна дополнительная функция:
Код imagebutton: idle "btn" hover "btn_hover" action Jump("some_label")
планета FOREVER!!! Unkenbro team
|
#3
Цитата dmit (  ) Вам не нужна дополнительная функция: Я понимаю, что конкретно эту функцию можно записать таким образом, но что, если кроме перехода к другому label мне также понадобится изменить еще несколько параметров или показать уведомление, или произвести еще N различных действий? Мне нужен вызов функции при нажатии на кнопку. renpy.jump("some_label") - просто пример нерабочего кода. Например, я не могу поместить в один action сразу и jump, и notify, и $ same_var = 1 и т.д., но зато могу поместить в одну функцию или метод класса.
Сообщение отредактировал android - Воскресенье, 20/Янв/2019, 14:21
|
#4
android, вызывайте Func на месте экшена без скобок:
Код textbutton "Кнопка" action Func Смысл в том, что когда мы подставляем в экшен функцию со скобками, мы ее выполняем, и происходит это в любой момент выполнения screen-экрана (перерисовка, взаимодействия, для пользователя незаметно), т.е. по нажатию на кнопку ренпай пытается выполнить не функцию, а результат уже случившегося выполнения функции. Без скобок это имя, т.е. мы говорим "в качестве экшена используй функцию по имени Func".
Но это работает только если ваша функция не принимает параметров, или все параметры необязательные. Функции с параметрами превращать в экшены нужно либо через curried-функции, либо с помощью встроенного экшена Function:
Код textbutton "Кнопка" Function(Func, <аргументы Func через запятую>)
|
#5
Ikuku, большое спасибо за подробные разъяснения.
|
#6
Цитата android (  ) я не могу поместить в один action сразу На самом деле можно, например:
Код action [Language("Japanese"), SetVariable("speechPrefix",'「'), SetVariable("speechSuffix",'」'), SelectedIf(_preferences.language=="Japanese")]
Сообщение отредактировал dmit - Воскресенье, 20/Янв/2019, 17:51
планета FOREVER!!! Unkenbro team
|
#7
Цитата dmit (  ) action [Language("Japanese"), SetVariable("speechPrefix",'「'), SetVariable("speechSuffix",'」'), SelectedIf(_preferences.language=="Japanese")]
Благодарю, кажется достаточно удобным.
|