一种新的输入–事件之键盘事件,,


  18.2键盘事件

  下面先来看一个键盘事件的例子。假设我们希望一旦按下键盘上的某个键就做某件事情。在Pygame中,这个事件是KEYDOWN。为了说明这个事件如何使用,下面不审用代码清单16-15中反弹球的例子,球会向两边移动,并在窗口边界反弹。不过在增加事件之前,下面先更新这个程序,加入我们刚学到的一些新内容。

  使用动画精灵

  使用clock.tick()而不是time.delay()

  首先,需要为球建立一个类。这个类要有一个_init_()方法和一个move()方法。我们将创建这个类的实例。另外在主while循环中将使用clock.tick(30)代码清单18-1显示了修改后的代码。

  与孩子一起学编程-python教程与孩子一起学编程-python教程

  这里要注意一个问题,移动球时我们没有“擦除”球,而是做了不同的处理。我们已经知道,在新位置上重画球之前要从原位置“擦除”动画精灵有两种方法:一种方法是在每个动画精灵的原位置上涂上背景颜色,另一种方法是直接重绘每一帧的整个背景---实际上每一次都会从一个空屏幕开始,在这里,我们采用了第二种做法,不过这里不是每次循环时使用screen.fill(),而是建立了一个名为background的表面,用白色填充。每次循环时,只需把这个背景“块移”到显示表面screen,这样也能达到目的:这只是完成这项工作的不同方法而已。

  按键事件

  现在我们要增加一个事件处理器,当按下向上箭头时让球上移,按下向下箭头时让球下移。Pygame包括多个不同模块,这一章中我们将使用的模块是paygame.event。

  我们已经保证Pygame事件循环会一直运行(while循环)。这个循环在扫描一个名为QUIT的特殊事件。

  与孩子一起学编程-python教程

  Pygame.event.get()方法从事件队列得到所有事件的一个列表。For循环迭代处理这个列表中的每一个事件,如果看到一个QUIT事件,它会运行一个名为sys.exit()的函数,这会关闭Pygame窗口,并结束程序,了解到这一点后,现在你应该已经完全清楚”点击X 结束程序”代码是如何工作的。

  不过对于这个例子,我们还希望检测另外一种不同类型的事件。我们希望知道何时按下一个按键,所以要查找KEYDOWN事件,我们需要这样的代码:

  与孩子一起学编程-python教程

  由于前面已经有了一个if语句,可以直接用elif增加另一个条件(我们已经在第7章介绍过这个内容)

  与孩子一起学编程-python教程

  按下按键时我们想做什么呢?我们说过,如果按下向上箭头,要让球上移,如果按下向下箭头,要让球下移,所以可以这样做:

  与孩子一起学编程-python教程

  K_UP和K_DOWN是Pygame中向上和向下箭头的名字,对代码清单18-1完成以上修改,程序现在如代码清单18-2所示。

  与孩子一起学编程-python教程与孩子一起学编程-python教程

  运行代码清单18-2中的程序,试着按下向上箭头和向下箭头。起作用吗?

  重复按键

  你可能已经注意到,如果保持按下向上或向下箭头不放,球只会向上或向下移动一步,这是因为,我们没有告诉程序如果按键一直按下时该怎么做。用户按键时,会生成一个KEYDOWN事件,不过Pygame中还有一个设置,可以在按键一直按下时生成多个KEYDOWN事件,这称为按键重复(key repeat)。你要告诉它开始重复之前等待多长时间,另外还要指出多长时间重复一次,这些值得单位都是毫秒(千分之一秒),可能像这样:

  与孩子一起学编程-python教程

  Delay值告诉Pygame在开始重复之前等待多长时间,interval值告诉Pygame按键要以多快的速度重复,也就是说,各个KEYDOWN事件之间要间隔多长时间。

  试着把这个代码增加到代码清单18-2(放在Pygame.init后面,不过要在while循环前面),盾看这会让程序的行为有什么变化。

  事件名和按键名

  查找按下的向上或向下箭头时,我们要寻找KEYDOWN事件类型以及K_UPT和K_DOWN按键名。还有其他事件吗?其他按键名是什么?

  实际上还有相当多的事件,所以这里不打算一一列出。

评论关闭