>>52742 Привет, извини за поздний ответ.
Отвечу сначала на вопрос о том, почему вызываются обе функции: ты сам их принудительно и явно вызываешь. Смотри внимательно за руками: ui.imagebutton(... hovered=testfunc(arrow_width) ...)
. Ты ведь не удивишься, что синус вызовется, если ты выполнишь ui.imagebutton(... xpos=10.0+5.0*sin(arrow_width) ...)
?
Предвидя следующий вопрос: да, можно сделать, чтобы функция вычислялась лишь по событию. Для этого тебе нужно lambda-выражение или функция, возвращающая функцию. Например, так:
def will_testfunc(arrow_width):
def testfunc(): # !!! обязательно без параметров
lalala()
zhuzhuzhu(arrow_width) # параметры пробрасываются
return True
return test_func # !!! именно так, без круглых скобок
Тогда код наподобие ui.imagebutton(... hovered=will_testfunc(arrow_width) ...)
в случае hover-события выполнит код из testfunc.
Предвидя следующий вопрос: нет, текущий код testfunc тебе не поможет в решении твоей задачи по увеличению спрайта карты на hover. ui-функции отвечают за формирование интерактивного экрана ДО вызова ui.interact() и вряд ли смогут быть корректно добавлены во время интерактива.
Вообще, ui.imagebutton имеет родной механизм модификации изображения на hover. Это собственно первый и второй параметры, через которые передаётся изображение на unhovered и hovered соответственно, при этом они не обязаны быть одного размера. Если тебе достаточно увеличения вправо и вниз при фиксированном угле, то достаточно обернуть второй параметр в im.FactorScale, но я сомневаюсь, что это то, чего ты хочешь.
Кривоватый, но действенный вариант, который прокатит без глубокого копания вглубь - передать первым параметром исходное изображение, окружённое прозрачной рамкой (я бы использовал im.Composite), а вторым параметром - увеличенное исходное изображение (соотвественно, im.FactorScale). Если хочешь, могу накидать пример. Вариант кривоват, потому что добавляет машине работы на пустом месте, возможны необоснованные тормоза.
Другой вариант - раскурить как работает renpy.display.behavior.Imagebutton и сделать так, чтобы hovered выводился со сдвигом влево-вверх (увеличение карты же должно быть равномерное). Не буду тебя томить, способ я нашёл, вот он:
label start:
python:
ui.imagebutton(
im.Scale("3_utan.png",360,540),
renpy.display.layout.Window(
ui._image(im.Scale("3_utan.png",396,594)),
left_margin=-18,
top_margin=-27,
xfill=False,
yfill=False
),
clicked=lambda:renpy.error("YOU WIN")
)
ui.interact()
jump start
Если кому-то интересно, что это вообще за хрень и как это работает, могу рассказать.