Константы pygame.K_
на самом деле являются просто числами (целыми числами), которые вы можете поместить в качестве значений в свой словарь keys
.
Я бы определил словарь с действиями (строками) в качестве ключей dict, а ключи pygame - в качестве значений, например: keys = {'move_left': pg.K_a, 'move_right': pg.K_d}
.
Затем вы можете включить цикл обработки событий if event.key == keys['move_left']:
и обработать это событие по своему усмотрению.
Чтобы сменить клавишу, сначала нужно выяснить, какому действию должна быть назначена новая клавиша, и, когда нажимается следующая клавиша, вставьте атрибут event.key
в качестве нового значения: keys[selected_action] = event.key
.
Это просто упрощенный пример, который еще можно улучшить, но он завершен и, насколько я вижу, работает правильно (нажмите Esc , чтобы переключить сцену назначения, нажмите одну из предыдущих клавиш, чтобы выбрать действие, а затем еще один ключ, чтобы назначить новый ключ для этого действия):
import sys
import pygame as pg
def key_assignment_scene(keys, screen, clock):
selected_action = None
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
elif event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
return keys # Return the keys to the main scene.
elif selected_action:
# Assign a new key to the action.
keys[selected_action] = event.key
print(keys, 'new key:', event.unicode)
selected_action = None
else: # Select an action (a key from the `keys` dict).
for action, pygame_key in keys.items():
if event.key == pygame_key:
selected_action = action
print('Selected action:', selected_action)
screen.fill((20, 40, 60))
pg.display.flip()
clock.tick(30)
def main():
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue1')
rect = pg.Rect(300, 220, 20, 20)
speed_x = 0
keys = {'move_left': pg.K_a, 'move_right': pg.K_d}
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
return
elif event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
print(keys)
# Switch to the key assigment scene.
keys = key_assignment_scene(keys, screen, clock)
elif event.key == keys['move_left']:
speed_x = -3
elif event.key == keys['move_right']:
speed_x = 3
elif event.type == pg.KEYUP:
if event.key == keys['move_left'] and speed_x < 0:
speed_x = 0
elif event.key == keys['move_right'] and speed_x > 0:
speed_x = 0
rect.x += speed_x
screen.fill(BG_COLOR)
pg.draw.rect(screen, BLUE, rect)
pg.display.flip()
clock.tick(30)
main()
pg.quit()