Pygame - 如何让我的用户更改他们的输入键? (自定义键绑定)
Pygame - How can I allow my users to change their input keys? (Custom Keybinding)
我正在尝试制作游戏并希望用户更改他们的输入键,例如他们按下 A 键,这会将 MoveUp
变量更改为 A 键,这样当他们在游戏中按下 A 时,他们就会向上移动。任何帮助或建议将不胜感激。
global MoveUp # MoveUp = pygame.K_UP
while not Fin:
for event in pygame.event.get():
pressed = pygame.key.pressed()
if event.type == pygame.KEYDOWN:
MoveUp = pressed
KeysLoop()
这段代码目前的问题是它给了我一个对应于按下的键的列表,我需要一个键标识符以便我可以使用 MoveUp
稍后移动我的精灵。
当您收到事件 KEYDOWN
时,您已按下 event.key
中的键
while not Fin:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN
MoveUp = event.key
顺便说一句:每个事件都可能有不同的字段。您可以在文档中的黄色列表中看到所有内容:event
您可以创建一个字典,将操作名称作为字典键,将 pygame 键(pygame.K_LEFT
等)作为值。例如:
input_map = {'move right': pygame.K_d, 'move left': pygame.K_a}
这允许您将其他 pygame 键分配给这些操作(在您的分配菜单的事件循环中):
if event.type == pygame.KEYDOWN:
# Assign the pygame key to the action in the keys dict.
input_map[selected_action] = event.key
然后,在 while
主循环中,您可以使用动作名称来检查是否按下了相应的键盘键:
pressed_keys = pygame.key.get_pressed()
if pressed_keys[input_map['move right']]:
在下面的示例中,您可以通过单击 ESCAPE
键来访问 assignment_menu
。它是一个单独的函数,有自己的 while 循环,我在其中创建了一个 table 动作和 pygame 键,你可以用鼠标 select 。如果一个动作是 selected 并且用户按下了一个键,我会在用户按下 Esc[= 时将 input_map
dict 和 return 更新为主游戏函数29=] 再次。
import sys
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
FONT = pg.font.Font(None, 40)
BG_COLOR = pg.Color('gray12')
GREEN = pg.Color('lightseagreen')
def create_key_list(input_map):
"""A list of surfaces of the action names + assigned keys, rects and the actions."""
key_list = []
for y, (action, value) in enumerate(input_map.items()):
surf = FONT.render('{}: {}'.format(action, pg.key.name(value)), True, GREEN)
rect = surf.get_rect(topleft=(40, y*40+20))
key_list.append([surf, rect, action])
return key_list
def assignment_menu(input_map):
"""Allow the user to change the key assignments in this menu.
The user can click on an action-key pair to select it and has to press
a keyboard key to assign it to the action in the `input_map` dict.
"""
selected_action = None
key_list = create_key_list(input_map)
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
elif event.type == pg.KEYDOWN:
if selected_action is not None:
# Assign the pygame key to the action in the input_map dict.
input_map[selected_action] = event.key
selected_action = None
# Need to re-render the surfaces.
key_list = create_key_list(input_map)
if event.key == pg.K_ESCAPE: # Leave the menu.
# Return the updated input_map dict to the main function.
return input_map
elif event.type == pg.MOUSEBUTTONDOWN:
selected_action = None
for surf, rect, action in key_list:
# See if the user clicked on one of the rects.
if rect.collidepoint(event.pos):
selected_action = action
screen.fill(BG_COLOR)
# Blit the action-key table. Draw a rect around the
# selected action.
for surf, rect, action in key_list:
screen.blit(surf, rect)
if selected_action == action:
pg.draw.rect(screen, GREEN, rect, 2)
pg.display.flip()
clock.tick(30)
def main():
player = pg.Rect(300, 220, 40, 40)
# This dict maps actions to the corresponding key scancodes.
input_map = {'move right': pg.K_d, 'move left': pg.K_a}
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE: # Enter the key assignment menu.
input_map = assignment_menu(input_map)
pressed_keys = pg.key.get_pressed()
if pressed_keys[input_map['move right']]:
player.x += 3
elif pressed_keys[input_map['move left']]:
player.x -= 3
screen.fill(BG_COLOR)
pg.draw.rect(screen, GREEN, player)
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
main()
pg.quit()
我正在尝试制作游戏并希望用户更改他们的输入键,例如他们按下 A 键,这会将 MoveUp
变量更改为 A 键,这样当他们在游戏中按下 A 时,他们就会向上移动。任何帮助或建议将不胜感激。
global MoveUp # MoveUp = pygame.K_UP
while not Fin:
for event in pygame.event.get():
pressed = pygame.key.pressed()
if event.type == pygame.KEYDOWN:
MoveUp = pressed
KeysLoop()
这段代码目前的问题是它给了我一个对应于按下的键的列表,我需要一个键标识符以便我可以使用 MoveUp
稍后移动我的精灵。
当您收到事件 KEYDOWN
时,您已按下 event.key
while not Fin:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN
MoveUp = event.key
顺便说一句:每个事件都可能有不同的字段。您可以在文档中的黄色列表中看到所有内容:event
您可以创建一个字典,将操作名称作为字典键,将 pygame 键(pygame.K_LEFT
等)作为值。例如:
input_map = {'move right': pygame.K_d, 'move left': pygame.K_a}
这允许您将其他 pygame 键分配给这些操作(在您的分配菜单的事件循环中):
if event.type == pygame.KEYDOWN:
# Assign the pygame key to the action in the keys dict.
input_map[selected_action] = event.key
然后,在 while
主循环中,您可以使用动作名称来检查是否按下了相应的键盘键:
pressed_keys = pygame.key.get_pressed()
if pressed_keys[input_map['move right']]:
在下面的示例中,您可以通过单击 ESCAPE
键来访问 assignment_menu
。它是一个单独的函数,有自己的 while 循环,我在其中创建了一个 table 动作和 pygame 键,你可以用鼠标 select 。如果一个动作是 selected 并且用户按下了一个键,我会在用户按下 Esc[= 时将 input_map
dict 和 return 更新为主游戏函数29=] 再次。
import sys
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
FONT = pg.font.Font(None, 40)
BG_COLOR = pg.Color('gray12')
GREEN = pg.Color('lightseagreen')
def create_key_list(input_map):
"""A list of surfaces of the action names + assigned keys, rects and the actions."""
key_list = []
for y, (action, value) in enumerate(input_map.items()):
surf = FONT.render('{}: {}'.format(action, pg.key.name(value)), True, GREEN)
rect = surf.get_rect(topleft=(40, y*40+20))
key_list.append([surf, rect, action])
return key_list
def assignment_menu(input_map):
"""Allow the user to change the key assignments in this menu.
The user can click on an action-key pair to select it and has to press
a keyboard key to assign it to the action in the `input_map` dict.
"""
selected_action = None
key_list = create_key_list(input_map)
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
elif event.type == pg.KEYDOWN:
if selected_action is not None:
# Assign the pygame key to the action in the input_map dict.
input_map[selected_action] = event.key
selected_action = None
# Need to re-render the surfaces.
key_list = create_key_list(input_map)
if event.key == pg.K_ESCAPE: # Leave the menu.
# Return the updated input_map dict to the main function.
return input_map
elif event.type == pg.MOUSEBUTTONDOWN:
selected_action = None
for surf, rect, action in key_list:
# See if the user clicked on one of the rects.
if rect.collidepoint(event.pos):
selected_action = action
screen.fill(BG_COLOR)
# Blit the action-key table. Draw a rect around the
# selected action.
for surf, rect, action in key_list:
screen.blit(surf, rect)
if selected_action == action:
pg.draw.rect(screen, GREEN, rect, 2)
pg.display.flip()
clock.tick(30)
def main():
player = pg.Rect(300, 220, 40, 40)
# This dict maps actions to the corresponding key scancodes.
input_map = {'move right': pg.K_d, 'move left': pg.K_a}
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE: # Enter the key assignment menu.
input_map = assignment_menu(input_map)
pressed_keys = pg.key.get_pressed()
if pressed_keys[input_map['move right']]:
player.x += 3
elif pressed_keys[input_map['move left']]:
player.x -= 3
screen.fill(BG_COLOR)
pg.draw.rect(screen, GREEN, player)
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
main()
pg.quit()