4.Pygame 键盘输入
所有的游戏都需要玩家与它进行互动体验。这种体验的第一步是获取用户的输入,并使用此输入以来影响游戏世界。
这方面的常见示例是用于移动角色的箭头键、用于各种攻击 (RPG) 的不同键或您使用鼠标选择的不同对话选项等。
介绍
Pygame 跟踪发生的“事件”,我们可以通过events.get()函数看到这些事件。有很多东西可以归类为事件,例如鼠标和键盘输入或窗口上的退出按钮。
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
以上代码是每个 pygame 程序中包含的标准事件检查。
检测键盘输入事件
在游戏循环中监听键盘输入事件:
- 监听所有事件 pygame.event.get()
- 检测是否有键盘按下
- 判断预定的键值
while True:
# 循环遍历事件列表
for event in pygame.event.get():
# 判断是否有键按下
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_m:
print("键发射火球")
if event.key == pygame.K_n:
handler.next_stage()
if event.key == pygame.K_q:
handler.interact()
if event.key == pygame.K_SPACE:
print("键跳跃")
if event.key == pygame.K_RETURN:
print("键攻击")
如果你想在你的代码中添加按键处理,上面的格式是一种万无一失的方法。您还可以使用该pygame.KEYUP事件,该事件在您释放按键时触发。
这是您可以在您的系统上运行的完整代码,它同时使用了KEYDOWN和KEYUP.
import pygame
from pygame.locals import *
import sys
pygame.init()
display = pygame.display.set_mode((300, 300))
while 1:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
print("a键按下")
if event.type == pygame.KEYUP:
if event.key == pygame.K_a:
print("a键释放")
检测按下的键
上述方法仅适用于单击按钮。只需单击一次或按住几秒钟都没有关系。它会产生同样的效果。这里要讨论的方法,是针对“按下”键输入的。
我们使用该get_pressed()函数返回所有键状态的列表。如果未按下该键,则其值为 0,否则为 1。以下代码中的 if 语句仅在键的状态为 1(按下)时激活。
while 1:
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_a]:
print("A被按下")
您会发现这种方法更适合许多游戏中的 Player 移动。不同的是,只要你按下“A”键,上面的打印语句就会继续打印,因为它正在检测连续输入。以前的方法只会激活它一次。
检测多键输入
这里的另一个很棒的功能是它可以同时检测到两个按键。你不能用第一种方法做的事情。
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_a] and pressed_keys[K_b]:
print("A,B被按下")
更多关于 Pygame 事件
键盘事件在启用其他很酷的功能方面发挥着重要作用,例如文本输入、玩家移动和其他快捷方式(打开库存)。
用户事件:创建的自定义 Pygame 事件。
常用键列表
总共可能有超过 100 个 Pygame 可以检测到的不同键。为了简洁起见,我们将坚持使用大约 50 个常用的。
Pygame 键 | 按键说明 |
---|---|
K_K_BACKSPACE | 退格键 |
K_TAB | Tab |
K_CLEAR | Clear |
K_RETURN | Return (Enter) |
K_ESCAPE | Escape (Esc) |
K_SPACE | 空格键 |
K_PLUS | plus sign ( + ) |
K_MINUS | minus sign ( – ) |
K_PERIOD | period ( . ) |
K_SLASH | forward slash |
K_UP | Up Key |
K_DOWN | Down Key |
K_LEFT | Left Key |
K_RIGHT | Right Key |
K_0 | 0 |
K_1 | 1 |
K_2 | 2 |
K_3 | 3 |
K_4 | 4 |
K_5 | 5 |
K_6 | 6 |
K_7 | 7 |
K_8 | 8 |
K_9 | 9 |
K a | a |
K_b | b |
K_c | c |
… | … |
K_y | y |
K_z | z |
K_DELETE | |
K_KP0 | (Keypad) 0 |
K_KP1 | (Keypad) 1 |
K_KP2 | (Keypad) 2 |
K_KP3 | (Keypad) 3 |
K_KP4 | (Keypad) 4 |
K_KP5 | (Keypad) 5 |
K_KP6 | (Keypad) 6 |
K_KP7 | (Keypad) 7 |
K_KP8 | (Keypad) 8 |
K_KP9 | (Keypad) 9 |
K_F1 | F1 |
K_F2 | F2 |
K_F3 | F3 |
… | … |
… | … |
K_F14 | F14 |
K_F15 | F15 |
K_RSHIFT | 右SHIFT键 |
K_K_LSHIFT | 左SHIFT键 |
K_RCLTRL | 右CTRL键 |
K_LCTRL | 左CTRL键 |
K_RALT | 右ALT键 |
K_LALT | 左ALT键 |
还有其他几个(不太常见的)键输入,例如您在完整的 pygame"keys”文档中找到的星号。