首页 » 父与子的编程之旅:与小卡特一起学Python » 父与子的编程之旅:与小卡特一起学Python全文在线阅读

《父与子的编程之旅:与小卡特一起学Python》18.2 键盘事件

关灯直达底部

下面先来看一个键盘事件的例子。假设我们希望一旦按下键盘上的某个键就做某件事情。在 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_UPK_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_UPK_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-UPK-DOWN。后面还会看到另外一些按键名,它们都以 K_ 开头,后面是按键的名字,例如:

  • K_a, K_b(对应字母键)

  • K_SPACE

  • K_ESCAPE

等等。