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

《父与子的编程之旅:与小卡特一起学Python》18.4 定时器事件

关灯直达底部

在这一章中,目前为止我们已经见过键盘事件和鼠标事件。另一种非常有用的事件(特别是在游戏和仿真中)是定时器事件(timer event)。定时器会按固定的间隔生成事件,就像你的闹钟一样。如果你设好闹钟,并把闹铃打开,每天它都会在固定的时刻响起来。

可以把 Pygame 定时器设置为任意间隔。如果定时器到时间,它会创建一个能够被事件循环检测到的事件。那么它会生成什么类型的事件呢?它生成的是一种用户事件(user event)。

Pygame 有很多预定义的事件类型。这些事件会编号(从 0 开始),它们还有自己的名字以便我们记住。我们已经见过一些事件名,比如 MOUSEBUTTONDOWNKEYDOWN。除此以外,Pygame 还为用户定义的事件(user-defined event)留出了很大空间。这些事件不是 Pygame 为特定事件预留的,你可以用它们表示任何事情,其中之一就是定时器。

要在 Pygame 中设置定时器,要使用 set_timer 函数,如下:

pygame.time.set_timer(EVENT_NUMBER, interval)  

EVENT_NUMBER 是事件编号,interval 是定时器多长时间(单位是毫秒)到期并生成一个事件。

要使用什么 EVENT_NUMBER 呢?应当使用 Pygame 还没有用过的一个编号(也就是说,尚未将这个编号用于其他事件)。可以询问 Pygame 哪些编号已经占用。可以在交互模式中执行下面的命令:

>>> import pygame>>> pygame.USEREVENT24  

这会告诉我们,Pygame 正在使用从 0 到 23 的事件编号,对于用户事件,第一个可用的编号是 24。所以需要选择 24 或一个更大的数。可以大到什么程度呢?可以再来问一问 Pygame。

>>> pygame.NUMEVENTS32  

NUMEVENTS 告诉我们 Pygame 中可以有的事件类型最大编号是 32(从 0 到 31)。所以必须选择一个大于或等于 24 但小于 32 的数。可以像这样直接设置定时器:

pygame.time.set_timer(24, 1000)  

不过,如果出于某种原因 USEREVENT 的值有变化,这个代码可能就无法正常工作了。可能这样做会更好一些:

pygame.time.set_timer(pygame.USEREVENT, 1000)  

如果我们必须建立另一个用户事件,可以使用 USEREVENT + 1,依此类推。这个例子中的 1000 表示 1000 毫秒,也就是 1 秒,所以这个定时器每秒响一次。下面把这个定时器放入我们反弹球程序中。

像前面一样,我们将利用事件让球上移或下移,不过由于这一次球并非由用户来控制,我们要让它除了在左右两边反弹还会在上下边反弹。在修改代码清单 18-2 的基础上,完整的程序见代码清单 18-3。

代码清单 18-3 使用一个定时器事件让球上移和下移

记住,/ 是行联接符 。可以用它把正常情况下应该写在一行上的内容分为两行来写。(不过不要在 / 后面加任何空格,否则行联接符将不起作用。)

保存并运行代码清单 18-3 中的程序,应该能看到球来回移动(从一边到另一边),另外还会向上或向下移动 30 个像素(每秒移动一次)。向上或向下移动就来自定时器事件。