Пользовательские курсоры мыши

В Ren'Py есть две системы для создания пользовательских курсоров мыши. Первая использует аппаратный курсор мыши, а вторая использует Ren'Py для отрисовки отображаемого объекта в качестве курсора.

Аппаратный курсор мыши имеет следующие преимущества:

  • Он очень быстрый.

  • Он требует очень мало ресурсов, оставляя Ren'Py время на другие задачи.

И ограничение:

  • Размеры курсоров ограничены. 32x32 гарантированно работает, 64x64 также, кажется, работает на многих системах.

  • Курсоры ограничены последовательностью файлов изображений.

Использование Ren'Py для отрисовки отображаемого объекта в качестве курсора инвертирует эти ограничения. Хотя курсорами может быть всё, что может нарисовать Ren'Py, Ren'Py необходимо производить эту отрисовку. При включенной тройной буферизации на компьютере может возникать задержка, которой нет у аппаратного курсора.

Аппаратный курсор мыши

Аппаратный курсор управляется переменной config.mouse. Эта переменная представляет собой словарь, который сопоставляет имена курсоров со списком кадров. Каждый кадр — это кортеж из трёх компонентов, который содержит файл изображения, а затем смещения X и Y внутри этого изображения.

Например:

define config.mouse = { }
define config.mouse['default'] = [ ( "gui/arrow.png", 0, 0) ]
define config.mouse['spin' ] = [
    ( "gui/spin0.png", 7, 7 ),
    ( "gui/spin1.png", 7, 7 ),
    ( "gui/spin2.png", 7, 7 ),
    ( "gui/spin3.png", 7, 7 ),
    ( "gui/spin4.png", 7, 7 ),
    ( "gui/spin5.png", 7, 7 ),
    ( "gui/spin6.png", 7, 7 ),
    ( "gui/spin7.png", 7, 7 ),
]

Когда анимация состоит из нескольких кадров, кадры воспроизводятся со скоростью 20 кадров в секунду. Ren'Py будет менять курсор только при изменении изображения или смещений.

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

Состояние

Использование

default

Используется постоянно, если не указано другое состояние. Он всегда должен присутствовать, так как используется при отсутствии более специфичного ключа

say

Используется, когда игрок находится на экране «Say».

with

Используется во время переходов.

menu

Используется, когда игрок находится в меню (например, choice).

prompt

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

imagemap

Используется на imagemap.

button

Используется, когда игрок наводит курсор на кнопку/imagebutton.

pause

Используется во время паузы, renpy.pause()

mainmenu

Используется в главном меню.

gamemenu

Используется в игровом меню.

Каждый ключ может иметь необязательный префикс pressed_, который указывает курсор, используемый при нажатии кнопки мыши. Например, pressed_button используется, когда пользователь нажимает на кнопку. Чтобы определить стандартный стиль курсора при нажатии, используйте ключ pressed_default. Он используется, когда никакой другой курсор для нажатия не определён.

Например:

define config.mouse = { }
define config.mouse['default'] = [ ( "gui/arrow.png", 0, 0) ]
define config.mouse['pressed_default'] = [ ( "gui/arrow_pressed.png", 0, 0) ]
define config.mouse['button'] = [ ( "gui/arrow_button.png", 0, 0) ]
define config.mouse['pressed_button'] = [ ( "gui/arrow_button_pressed.png", 0, 0) ]
define config.mouse['menu'] = [ ( "gui/arrow_menu.png", 0, 0) ] # Этот курсор будет использоваться, когда игрок находится в меню
# Так как нет курсора "pressed_menu", вместо него будет использоваться курсор "pressed_default"

Отображаемый курсор мыши

Отображаемый курсор использует переменную config.mouse_displayable и отображаемый объект MouseDisplayable. Например:

image mouse spin:
    "gui/spin0.png"
    rotate 0.0
    linear 1.0 rotate 360.0

    # Pause so image prediction can happen.
    pause 1.0

    repeat

define config.mouse_displayable = MouseDisplayable(
    "gui/arrow.png", 0, 0).add("spin", "mouse spin", 9.9, 9.9)
class MouseDisplayable(cursor, x=0, y=0)

Displayable, который является обёрткой для displayable курсора мыши и заставляет его двигаться по экрану, когда игрок перемещает мышь.

cursor

Displayable, который используется для отрисовки мыши. Если это None, используется аппаратный курсор.

x, y

Координаты активной точки (hotspot) относительно верхнего левого угла курсора, в виртуальных пикселях.

add(name, cursor, x=0, y=0)

Этот метод добавляет второй курсор, который используется, когда отображается мышь с именем name. Метод возвращает MouseDisplayable, чтобы вызовы этого метода можно было объединять в цепочку.

Использование курсоров мыши

Обычный способ использования курсора мыши — это предоставление свойства mouse с именем курсора элементу, который может получить фокус на экране (кнопка или bar). Например:

screen test():
    textbutton "Mouse Test" action NullAction() mouse "spin"

Также можно использовать default_mouse для установки курсора мыши глобально:

$ default_mouse = "spin"