配置项 config.keymap
中包含一个事件名称与触发事件的快捷键系统的映射关系。
Note
许多用户已经学会了Ren’Py的默认按键绑定,并希望各游戏保持一致。
在Ren’Py快捷键系统中,使用字符串表示鼠标按键、游戏手柄按键和键盘按键。
鼠标按键的快捷键格式是‘mouseup_#’或‘mousedown_#’,其中的 # 符号代表按键的编号。Ren’Py假设鼠标有5个按键,其中按键1、2、3分别表示左、中、右键,按键4和5分别表示滚轮的上滑和下滑。例如,“mousedown_1”代表鼠标左键按下,“mouseup_1”表示鼠标左键弹起,“mousedown_4”表示滚轮上滑。
总共有两种键盘的快捷键。第一种是字符串里只有一个字符,有某个按键被按下时生成。通常用于绑定字母或数字按键。典型的快捷键包括“a”、“A”和“7”等。 注意这里的字母对大小写敏感,“a”与“A”是不同字母。
键盘快捷键也可以是符号或者功能按键。可以是pygame.constants中定义的任意 K_ 形式常量。这种快捷键字符串类似于 “K_BACKSPACE”、 “K_RETURN”和 “K_TAB”;完整的快捷键定义详见 这里。
键盘快捷键可以使用下列前缀,与后面的字符用下划线分割:
例如,快捷键“shift_alt_K_F5”,当shift和alt键一直按下时,按下F5可以匹配到。
要修改快捷键和事件的绑定关系,就需要修改 config.keymap
。下面的脚本将“t”键添加到按键列表中,作用是dismiss某say语句,并从列表中移除了空格键。
init:
$ config.keymap['dismiss'].append('t')
$ config.keymap['dismiss'].remove('K_SPACE')
默认的按键映射放在renpy/common/00keymap.rpy文件中,下面是7.4版本的配置:
config.keymap = dict(
# 除非明确禁用,各处都能使用的绑定快捷键。
rollback = [ 'K_PAGEUP', 'repeat_K_PAGEUP', 'K_AC_BACK', 'mousedown_4' ],
screenshot = [ 's', 'alt_K_s', 'alt_shift_K_s', 'noshift_K_s' ],
toggle_afm = [ ],
toggle_fullscreen = [ 'f', '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', 'h', 'noshift_K_h' ],
launch_editor = [ 'E', 'shift_K_e' ],
dump_styles = [ ],
reload_game = [ 'R', 'alt_shift_K_r', 'shift_K_r' ],
inspector = [ 'I', 'shift_K_i' ],
full_inspector = [ 'alt_shift_K_i' ],
developer = [ 'shift_K_d', 'alt_shift_K_d' ],
quit = [ ],
iconify = [ ],
help = [ 'K_F1', 'meta_shift_/' ],
choose_renderer = [ 'G', 'alt_shift_K_g', 'shift_K_g' ],
progress_screen = [ 'alt_shift_K_p', 'meta_shift_K_p', 'K_F2' ],
accessibility = [ "K_a" ],
# 数据读取。
self_voicing = [ 'v', 'V', 'alt_K_v', 'K_v' ],
clipboard_voicing = [ 'C', 'alt_shift_K_c', 'shift_K_c' ],
debug_voicing = [ 'alt_shift_K_v', 'meta_shift_K_v' ],
# say相关。
rollforward = [ 'mousedown_5', 'K_PAGEDOWN', 'repeat_K_PAGEDOWN' ],
dismiss = [ 'mouseup_1', 'K_RETURN', 'K_SPACE', 'K_KP_ENTER', 'K_SELECT' ],
dismiss_unfocused = [ ],
# 暂停。
dismiss_hard_pause = [ ],
# 焦点相关。
focus_left = [ 'K_LEFT', 'repeat_K_LEFT' ],
focus_right = [ 'K_RIGHT', 'repeat_K_RIGHT' ],
focus_up = [ 'K_UP', 'repeat_K_UP' ],
focus_down = [ 'K_DOWN', 'repeat_K_DOWN' ],
# 按钮。
button_ignore = [ 'mousedown_1' ],
button_select = [ 'mouseup_1', 'K_RETURN', 'K_KP_ENTER', 'K_SELECT' ],
button_alternate = [ 'mouseup_3' ],
button_alternate_ignore = [ 'mousedown_3' ],
# 输入。
input_backspace = [ 'K_BACKSPACE', 'repeat_K_BACKSPACE' ],
input_enter = [ 'K_RETURN', 'K_KP_ENTER' ],
input_left = [ 'K_LEFT', 'repeat_K_LEFT' ],
input_right = [ 'K_RIGHT', 'repeat_K_RIGHT' ],
input_up = [ 'K_UP', 'repeat_K_UP' ],
input_down = [ 'K_DOWN', 'repeat_K_DOWN' ],
input_delete = [ 'K_DELETE', 'repeat_K_DELETE' ],
input_home = [ 'K_HOME' ],
input_end = [ 'K_END' ],
input_copy = [ 'ctrl_noshift_K_INSERT', 'ctrl_noshift_K_c' ],
input_paste = [ 'shift_K_INSERT', 'ctrl_noshift_K_v' ],
# 视口。
viewport_leftarrow = [ 'K_LEFT', 'repeat_K_LEFT' ],
viewport_rightarrow = [ 'K_RIGHT', 'repeat_K_RIGHT' ],
viewport_uparrow = [ 'K_UP', 'repeat_K_UP' ],
viewport_downarrow = [ 'K_DOWN', 'repeat_K_DOWN' ],
viewport_wheelup = [ 'mousedown_4' ],
viewport_wheeldown = [ 'mousedown_5' ],
viewport_drag_start = [ 'mousedown_1' ],
viewport_drag_end = [ 'mouseup_1' ],
viewport_pageup = [ 'K_PAGEUP', 'repeat_K_PAGEUP' ],
viewport_pagedown = [ 'K_PAGEDOWN', 'repeat_K_PAGEDOWN' ],
# 这些按键控制跳过。
skip = [ 'K_LCTRL', '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 = [ 'K_LEFT', 'repeat_K_LEFT' ],
bar_right = [ 'K_RIGHT', 'repeat_K_RIGHT' ],
bar_up = [ 'K_UP', 'repeat_K_UP' ],
bar_down = [ 'K_DOWN', 'repeat_K_DOWN' ],
# 删除存档。
save_delete = [ 'K_DELETE' ],
# 可拖拽组件。
drag_activate = [ 'mousedown_1' ],
drag_deactivate = [ 'mouseup_1' ],
# 调试控制台。
console = [ 'shift_K_o', 'alt_shift_K_o' ],
console_older = [ 'K_UP', 'repeat_K_UP' ],
console_newer = [ 'K_DOWN', 'repeat_K_DOWN'],
# 编导器
director = [ 'noshift_K_d' ],
# 忽略(保持后向兼容)。
toggle_music = [ 'm' ],
viewport_up = [ 'mousedown_4' ],
viewport_down = [ 'mousedown_5' ],
# Profile命令。
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_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" : [ "button_alternate" ],
"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_”。
需要执行特定初始流程才能使用手柄,默认是禁用状态。包括任天堂Switch的Pro手柄,在电脑上使用时会要求特殊的初始化流程。
控制器黑名单详见 config.controller_blocklist
。