Anivisual Contest #4 · Пользователи · Новые посты · Правила форума · Поиск по форуму · · · Регистрация
  • Страница 1 из 1
  • 1
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Exception при вызове функции из screens.rpy
Exception при вызове функции из screens.rpy

android
Дата: Воскресенье, 20 Января 2019, 02:14 | Сообщение # 1
Пользователь
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Здравствуйте. Возникла проблема при написании функции на 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 все работает нормально:
Код
$ Func()

Надеюсь, что изложил суть проблемы достаточно подробно. Заранее спасибо.


Сообщение отредактировал android - Воскресенье, 20 Января 2019, 02:22

dmit
Дата: Воскресенье, 20 Января 2019, 08:52 | Сообщение # 2
Проверенный
Сообщений: 159
Награды: 0
Репутация: 19
Замечания: 0%
Вам не нужна дополнительная функция:
Код
imagebutton:
            idle "btn"
            hover "btn_hover"
            action Jump("some_label")


планета FOREVER!!!

android
Дата: Воскресенье, 20 Января 2019, 15:19 | Сообщение # 3
Пользователь
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Цитата dmit ()
Вам не нужна дополнительная функция:

Я понимаю, что конкретно эту функцию можно записать таким образом, но что, если кроме перехода к другому label мне также понадобится изменить еще несколько параметров или показать уведомление, или произвести еще N различных действий? Мне нужен вызов функции при нажатии на кнопку. renpy.jump("some_label") - просто пример нерабочего кода.
Например, я не могу поместить в один action сразу и jump, и notify, и $ same_var = 1 и т.д., но зато могу поместить в одну функцию или метод класса.


Сообщение отредактировал android - Воскресенье, 20 Января 2019, 15:21

Ikuku
Дата: Воскресенье, 20 Января 2019, 15:40 | Сообщение # 4
Разработчик
Сообщений: 28
Награды: 2
Репутация: 93
Замечания: 0%
android, вызывайте Func на месте экшена без скобок:
Код
textbutton "Кнопка" action Func

Смысл в том, что когда мы подставляем в экшен функцию со скобками, мы ее выполняем, и происходит это в любой момент выполнения screen-экрана (перерисовка, взаимодействия, для пользователя незаметно), т.е. по нажатию на кнопку ренпай пытается выполнить не функцию, а результат уже случившегося выполнения функции. Без скобок это имя, т.е. мы говорим "в качестве экшена используй функцию по имени Func".

Но это работает только если ваша функция не принимает параметров, или все параметры необязательные. Функции с параметрами превращать в экшены нужно либо через curried-функции, либо с помощью встроенного экшена Function:
Код
textbutton "Кнопка" Function(Func, <аргументы Func через запятую>)

android
Дата: Воскресенье, 20 Января 2019, 16:49 | Сообщение # 5
Пользователь
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Ikuku, большое спасибо за подробные разъяснения.

dmit
Дата: Воскресенье, 20 Января 2019, 18:50 | Сообщение # 6
Проверенный
Сообщений: 159
Награды: 0
Репутация: 19
Замечания: 0%
Цитата android ()
я не могу поместить в один action сразу
На самом деле можно, например:
Код
action [Language("Japanese"), SetVariable("speechPrefix",'「'), SetVariable("speechSuffix",'」'), SelectedIf(_preferences.language=="Japanese")]


планета FOREVER!!!

Сообщение отредактировал dmit - Воскресенье, 20 Января 2019, 18:51

android
Дата: Вторник, 22 Января 2019, 00:55 | Сообщение # 7
Пользователь
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Цитата dmit ()

action [Language("Japanese"), SetVariable("speechPrefix",'「'), SetVariable("speechSuffix",'」'), SelectedIf(_preferences.language=="Japanese")]

Благодарю, кажется достаточно удобным.
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Exception при вызове функции из screens.rpy
  • Страница 1 из 1
  • 1
Поиск: