下面先来看一个键盘事件的例子。假设我们希望一旦按下键盘上的某个键就做某件事情。在 Pygame 中,这个事件是 KEYDOWN
。为了说明这个事件如何使用,下面还是用代码清单 16-15 中反弹球的例子,球会向两边移动,并在窗口边界反弹。不过在增加事件之前,下面先更新这个程序,加入我们刚学到的一些新内容:
使用动画精灵;
使用
clock.tick
而不是time.delay
。
首先,需要为球建立一个类。这个类要有一个 __init__
方法和一个 move
方法。我们将创建这个类的实例,另外在主 while
循环中将使用 clock.tick(30)
。代码清单 18-1 显示了修改后的代码。
代码清单 18-1 反弹球程序,加入动画精灵和
Clock.tick
这里要注意一个问题,移动球时我们没有“擦除”球,而是做了不同的处理。我们已经知道,在新位置上重画球之前要从原位置“擦除”动画精灵有两种方法:一种方法是在每个动画精灵的原位置上涂上背景颜色,另一种方法是直接重绘每一帧的整个背景——实际上每一次都会从一个空屏幕开始。在这里,我们采用了第二种做法。不过这里不是每次循环时使用 screen.fill
,而是建立了一个名为 background
的表面,用白色填充。每次循环时,只需把这个背景“块移”到显示表面 screen
。这样也能达到目的;这只是完成这项工作的不同方法而已。
按键事件
现在我们要增加一个事件处理器,当按下向上箭头时让球上移,按下向下箭头时让球下移。Pygame 包括多个不同模块。这一章中我们将使用的模块是 pygame.event
。
我们已经保证 Pygame 事件循环会一直运行(while
循环)。这个循环在扫描一个名为 QUIT
的特殊事件。
while running: for event in pygame.event.get:if event.type == pygame.QUIT: running = False
pygame.event.get
方法从事件队列得到所有事件的一个列表。for
循环迭代处理这个列表中的每一个事件,如果看到一个 QUIT
事件,它会将 running
设置为 False
,这会导致 while
循环结束,并结束程序。了解到这一点后,现在你应该已经完全清楚“点击 × 结束程序”代码是如何工作的。
不过对于这个例子,我们还希望检测另外一种不同类型的事件。我们希望知道何时按下一个按键,所以要查找 KEYDOWN
事件。我们需要这样的代码:
if event.type == pygame.KEYDOWN
由于前面已经有了一个 if
语句,可以直接用 elif
增加另一个条件(我们已经在第 7 章介绍过这个内容):
按下按键时我们想做什么呢?我们说过,如果按下向上箭头,要让球上移,如果按下向下箭头,要让球下移。所以可以这样做:
K_UP
和 K_DOWN
是 Pygame 中向上和向下箭头的名字。对代码清单 18-1 完成以上修改,程序现在如代码清单 18-2 所示。
代码清单 18-2 响应向上和向下箭头键的反弹球
运行代码清单 18-2 中的程序,试着按下向上箭头和向下箭头。起作用吗?
重复按键
你可能已经注意到,如果保持按下向上或向下箭头不放,球只会向上或向下移动一步。这是因为,我们没有告诉程序如果按键一直按下时该怎么做。用户按键时,会生成一个 KEYDOWN
事件,不过 Pygame 中还有一个设置,可以在按键一直按下时生成多个 KEYDOWN
事件。这称为按键重复(key repeat)。你要告诉它开始重复之前等待多长时间,另外还要指出多长时间重复一次。这些值的单位都是毫秒(千分之一秒)。可能像这样:
delay = 100interval = 50pygame.key.set_repeat(delay, interval)
delay
值告诉 Pygame 在开始重复之前等待多长时间,interval
值告诉 Pygame 按键要以多快的速度重复,也就是说,各个 KEYDOWN
事件之间要间隔多长时间。
试着把这个代码增加到代码清单 18-2(放在 pygame.init
后面,不过要在 while
循环前面),看看这会让程序的行为有什么变化。
事件名和按键名
查找按下的向上或向下箭头时,我们要寻找 KEYDOWN
事件类型以及 K_UP
和 K_DOWN
按键名。还有其他事件吗?其他按键名是什么?
实际上还有相当多的事件,所以这里不打算一一列出。不过 Pygame 网站上提供了所有事件的列表。可以在 Pygame 文档的 event 部分找到这个事件列表:
www.pygame.org/docs/ref/event.html
按键名列表放在 key 部分:
www.pygame.org/docs/ref/key.html
以下是我们将要使用的一些常用事件:
QUIT
KEYDOWN
KEYUP
MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN
Pygame 还给每个可以按下的键命了名。我们刚才看到了向上和向下箭头,它们的名字分别是 K-UP
和 K-DOWN
。后面还会看到另外一些按键名,它们都以 K_
开头,后面是按键的名字,例如:
K_a, K_b
(对应字母键)K_SPACE
K_ESCAPE
等等。