Настройка раскладки клавиатуры

Переменная config.keymap содержит сопоставление имён событий со списками кодов клавиш (keysyms), которые вызывают эти события.

Примечание

Многие игроки привыкли к стандартному набору клавиш Ren'Py и ожидают, что он будет одинаковым во всех играх.

В Ren'Py коды клавиш (keysyms) — это строки, представляющие кнопки мыши, джойстика или клавиатуры.

Кнопки мыши используют коды вида 'mouseup_#' или 'mousedown_#', где # — это номер кнопки. Ren'Py предполагает наличие пяти кнопочной мыши, где кнопки 1, 2 и 3 — это левая, средняя и правая кнопки, а кнопки 4 и 5 генерируются при прокрутке колеса вверх и вниз. Например, "mousedown_1" — это, как правило, нажатие левой кнопки мыши, "mouseup_1" — отпускание этой кнопки, а "mousedown_4" — прокрутка колеса мыши вверх.

Существует два вида кодов клавиш клавиатуры. Первый — это строка, содержащая символ, который генерируется при нажатии клавиши. Это полезно для привязки буквенных и цифровых клавиш. Примеры таких кодов: "a", "A" и "7". Обратите внимание, что они чувствительны к регистру, "a" не совпадает с "A". Этот тип кода клавиши полезен только тогда, когда событие генерирует текст — например, отпускание клавиши 'a' не будет соответствовать keyup_a, так как текст не генерируется.

Коды клавиш клавиатуры также могут быть символическими именами клавиш. Это может быть любая из констант K_, взятых из pygame.constants. Этот тип кода клавиши выглядит как "K_BACKSPACE", "K_RETURN" и "K_TAB"; полный список таких кодов можно найти здесь.

Кодам клавиш клавиатуры и мыши могут предшествовать следующие префиксы, разделённые подчёркиваниями:

alt

Срабатывает, если нажата клавиша Alt. Коды клавиш без этого префикса срабатывают, когда клавиша Alt не нажата.

meta

Срабатывает, если нажата клавиша Meta, Command или Windows. Коды клавиш без этого префикса срабатывают, когда клавиша meta не нажата.

ctrl

Срабатывает, если нажата клавиша Ctrl. Коды клавиш без этого префикса срабатывают, когда клавиша Ctrl не нажата. (Ctrl не очень полезен, так как обычно запускает пропуск.)

osctrl

Это Alt на Macintosh и Ctrl на других платформах.

anymod

Срабатывает независимо от состояния клавиш Alt, Meta или Ctrl.

shift

Срабатывает, когда нажата клавиша Shift.

noshift

Срабатывает, когда клавиша Shift не нажата.

caps

Срабатывает, когда включён Caps Lock.

nocaps

Срабатывает, когда Caps Lock выключен.

num

Срабатывает, когда включён Num Lock.

nonum

Срабатывает, когда Num Lock выключен.

repeat

Срабатывает, когда нажатие является повторным из-за удержания клавиши. Коды клавиш без префиксов repeat или anyrepeat не срабатывают на повторы. (Это не работает с кнопками мыши.)

anyrepeat

Срабатывает как при первоначальном нажатии, так и при повторах.

keydown

Срабатывает при нажатии клавиши (по умолчанию).

keyup

Срабатывает при отпускании клавиши.

Например, код клавиши "shift_alt_K_F5" сработает при нажатии клавиши F5 с зажатыми Shift и Alt. Код "shift_mouse_1" сработает при нажатии левой кнопки мыши с зажатой клавишей Shift.

Чтобы изменить привязку, обновите соответствующий список в config.keymap. Следующий код добавляет клавишу 't' в список клавиш, которые закрывают реплику, и удаляет из этого списка клавишу пробела.

init python:
    config.keymap['dismiss'].append('K_t')
    config.keymap['dismiss'].remove('K_SPACE')

Раскладка по умолчанию содержится в файле renpy/common/00keymap.rpy, и начиная с версии 8.4.0, выглядит следующим образом:

config.keymap = dict(

    # Привязки, действующие почти везде, если не отключены явно.
    rollback = [ 'anyrepeat_K_PAGEUP', 'anyrepeat_KP_PAGEUP', 'K_AC_BACK', 'mousedown_4' ],
    screenshot = [ 'alt_K_s', 'alt_shift_K_s', 'noshift_K_s' ],
    toggle_afm = [ ],
    toggle_fullscreen = [ 'alt_K_RETURN', 'alt_K_KP_ENTER', 'K_F11', 'noshift_K_f' ],
    game_menu = [ 'K_ESCAPE', 'K_MENU', 'K_PAUSE', 'mouseup_3' ],
    hide_windows = [ 'mouseup_2', 'noshift_K_h' ],
    launch_editor = [ 'shift_K_e' ],
    dump_styles = [ ],
    reload_game = [ 'alt_K_r', 'shift_K_r' ],
    inspector = [ 'alt_noshift_K_i', 'shift_K_i' ],
    full_inspector = [ 'alt_shift_K_i' ],
    developer = [ 'alt_K_d', 'shift_K_d', ],
    quit = [ ],
    iconify = [ ],
    help = [ 'K_F1', 'meta_shift_/' ],
    choose_renderer = ['alt_K_g', 'shift_K_g' ],
    progress_screen = [ 'alt_shift_K_p', 'meta_shift_K_p', 'K_F2' ],
    bubble_editor = [ 'alt_K_b', 'shift_K_b' ],

    # Специальные возможности.
    accessibility = [ 'shift_K_a' ],
    self_voicing = [ 'alt_K_v', 'K_v' ],
    clipboard_voicing = [ 'alt_shift_K_c', 'shift_K_c' ],
    debug_voicing = [ 'alt_shift_K_v', 'meta_shift_K_v' ],
    extra_voicing = [ '?' ],

    # Реплики.
    rollforward = [ 'anyrepeat_K_PAGEDOWN', 'anyrepeat_KP_PAGEDOWN', 'mousedown_5', ],
    dismiss = [ 'K_RETURN', 'K_SPACE', 'K_KP_ENTER', 'K_SELECT', 'mouseup_1' ],
    dismiss_unfocused = [ ],

    # Пауза.
    dismiss_hard_pause = [ ],

    # Фокус.
    focus_left = [ 'anyrepeat_K_LEFT', 'anyrepeat_KP_LEFT' ],
    focus_right = [ 'anyrepeat_K_RIGHT', 'anyrepeat_KP_RIGHT' ],
    focus_up = [ 'anyrepeat_K_UP', 'anyrepeat_KP_UP' ],
    focus_down = [ 'anyrepeat_K_DOWN', 'anyrepeat_KP_DOWN' ],

    # Кнопка.
    button_ignore = [ 'mousedown_1' ],
    button_select = [ 'K_RETURN', 'K_KP_ENTER', 'K_SELECT', 'mouseup_1',  ],
    button_alternate = [ 'mouseup_3' ],
    button_alternate_ignore = [ 'mousedown_3' ],

    # Ввод.
    input_backspace = [ 'anyrepeat_K_BACKSPACE' ],
    input_enter = [ 'K_RETURN', 'K_KP_ENTER' ],
    input_next_line = [ 'shift_K_RETURN', 'shift_K_KP_ENTER' ],
    input_left = [ 'anyrepeat_K_LEFT', 'anyrepeat_KP_LEFT' ],
    input_right = [ 'anyrepeat_K_RIGHT', 'anyrepeat_KP_RIGHT' ],
    input_up = [ 'anyrepeat_K_UP', 'anyrepeat_KP_UP' ],
    input_down = [ 'anyrepeat_K_DOWN', 'anyrepeat_KP_DOWN' ],
    input_delete = [ 'anyrepeat_K_DELETE', 'anyrepeat_KP_DELETE' ],
    input_home = [ 'K_HOME', 'KP_HOME', 'meta_K_LEFT' ],
    input_end = [ 'K_END', 'KP_END', 'meta_K_RIGHT' ],
    input_copy = [ 'ctrl_noshift_K_INSERT', 'ctrl_noshift_K_c', 'meta_noshift_K_c' ],
    input_paste = [ 'shift_K_INSERT', 'ctrl_noshift_K_v', 'meta_noshift_K_v' ],
    input_jump_word_left = [ 'osctrl_K_LEFT', 'osctrl_KP_LEFT' ],
    input_jump_word_right = [ 'osctrl_K_RIGHT', 'osctrl_KP_RIGHT' ],
    input_delete_word = [ 'osctrl_K_BACKSPACE' ],
    input_delete_full = [ 'meta_K_BACKSPACE' ],

    # Viewport.
    viewport_leftarrow = [ 'anyrepeat_K_LEFT', 'anyrepeat_KP_LEFT' ],
    viewport_rightarrow = [ 'anyrepeat_K_RIGHT', 'anyrepeat_KP_RIGHT' ],
    viewport_uparrow = [ 'anyrepeat_K_UP', 'anyrepeat_KP_UP' ],
    viewport_downarrow = [ 'anyrepeat_K_DOWN', 'anyrepeat_KP_DOWN' ],
    viewport_wheelup = [ 'mousedown_4' ],
    viewport_wheeldown = [ 'mousedown_5' ],
    viewport_drag_start = [ 'mousedown_1' ],
    viewport_drag_end = [ 'mouseup_1' ],
    viewport_pageup = [ 'anyrepeat_K_PAGEUP', 'anyrepeat_KP_PAGEUP'],
    viewport_pagedown = [ 'anyrepeat_K_PAGEDOWN', 'anyrepeat_KP_PAGEDOWN' ],

    # Эти клавиши управляют пропуском.
    skip = [ 'anymod_K_LCTRL', 'anymod_K_RCTRL' ],
    stop_skipping = [ ],
    toggle_skip = [ 'K_TAB' ],
    fast_skip = [ '>', 'shift_K_PERIOD' ],

    # Полоса прокрутки (Bar).
    bar_activate = [ 'mousedown_1', 'K_RETURN', 'K_KP_ENTER', 'K_SELECT' ],
    bar_deactivate = [ 'mouseup_1', 'K_RETURN', 'K_KP_ENTER', 'K_SELECT' ],
    bar_left = [ 'anyrepeat_K_LEFT', 'anyrepeat_KP_LEFT' ],
    bar_right = [ 'anyrepeat_K_RIGHT', 'anyrepeat_KP_RIGHT' ],
    bar_up = [ 'anyrepeat_K_UP', 'anyrepeat_KP_UP' ],
    bar_down = [ 'anyrepeat_K_DOWN', 'anyrepeat_KP_DOWN' ],

    # Удалить сохранение.
    save_delete = [ 'K_DELETE', 'KP_DELETE' ],

    # Постраничная навигация на экране сохранения/загрузки.
    save_page_prev = ['mousedown_4'],
    save_page_next = ['mousedown_5'],

    # Перетаскиваемый объект (Draggable).
    drag_activate = [ 'mousedown_1' ],
    drag_deactivate = [ 'mouseup_1' ],

    # Отладочная консоль.
    console = [ 'shift_K_o', 'alt_shift_K_o' ],
    console_exit = [ 'K_ESCAPE', 'K_MENU', 'K_PAUSE', 'mouseup_3' ],
    console_older = [ 'anyrepeat_K_UP', 'anyrepeat_KP_UP' ],
    console_newer = [ 'anyrepeat_K_DOWN', 'anyrepeat_KP_DOWN' ],

    # Режиссёр (Director)
    director = [ 'noshift_K_d' ],

    # Игнорируется (сохранено для обратной совместимости).
    toggle_music = [ ],
    viewport_up = [ ],
    viewport_down = [ ],

    # Команды профилирования.
    performance = [ 'K_F3' ],
    image_load_log = [ 'K_F4' ],
    profile_once = [ 'K_F8' ],
    memory_profile = [ 'K_F7' ],
)

Привязки геймпада работают немного иначе. Привязки геймпада работают путём сопоставления события геймпада с одним или несколькими именами событий Ren'Py. Стандартный набор привязок геймпада приведён ниже:

config.pad_bindings = {
    "pad_leftshoulder_press" : [ "rollback", ],
    "pad_lefttrigger_pos" : [ "rollback", ],
    "pad_back_press" : [ "rollback", ],

    "repeat_pad_leftshoulder_press" : [ "rollback", ],
    "repeat_pad_lefttrigger_pos" : [ "rollback", ],
    "repeat_pad_back_press" : [ "rollback", ],

    "pad_guide_press" : [ "game_menu", ],
    "pad_start_press" : [ "game_menu", ],

    "pad_y_press" : [ "hide_windows", ],
    "pad_x_press" : [ "button_alternate" ],

    "pad_rightshoulder_press" : [ "rollforward", ],
    "repeat_pad_rightshoulder_press" : [ "rollforward", ],

    "pad_righttrigger_pos" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate" ],
    "pad_a_press" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate"],
    "pad_b_press" : [ "game_menu" ],

    "pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ],
    "pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ],
    "pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ],

    "pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ],
    "pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ],
    "pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ],

    "pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ],
    "pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ],
    "pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ],

    "pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ],
    "pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ],
    "pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ],

    "repeat_pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ],
    "repeat_pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ],
    "repeat_pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ],

    "repeat_pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ],
    "repeat_pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ],
    "repeat_pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ],

    "repeat_pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ],
    "repeat_pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ],
    "repeat_pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ],

    "repeat_pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ],
    "repeat_pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ],
    "repeat_pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ],
}

Кнопки геймпада имеют имя события в форме "pad_*button*_press" или "pad_*button*_release". События аналоговых осей имеют форму "pad_*axis*_pos", "pad_*axis*_neg" или "pad_*axis*_zero". При удержании генерируется вторая привязка геймпада с префиксом "repeat_".

Геймпады, которые не работают без специальной инициализации, по умолчанию отключены. К ним относится контроллер Nintendo Switch Pro, который требует специальной инициализации для работы на ПК. Это занесение в чёрный список контролируется переменной config.controller_blocklist.

renpy.clear_keymap_cache()

Очищает кеш раскладки клавиш (keymap). Это позволяет изменениям в config.keymap вступить в силу без перезапуска Ren'Py.