动画精灵和碰撞检测之查检、调整帧速率,,


  查检帧速率

  如果想知道你的程序能以多快的速度运行,可以用一个名为clock.get_fps()的函数检查帧速率。当然,如果将帧速率设置为30,它就总会以30fps的帧速率运行(假设你的计算机能够运行那么快),要看一个特定程序在特定机器上运行的最快速度,可以先将colck.tick设置得非常快(例如200fps),然后运行这个程序,用clock.get_fps()检查实际的帧速率。(接下来就会给出一个这样的例子)。

  调整帧速率

  如果想要确保你的动画在每个机器上都以相同的速度运行,可以利用clock.get_tick()和clock.get_fps()实现一个小技巧,因为你知道要以多快的速度运行,而且也知道实际运行的速度,因此可以根据机器的速度调整(scale)动画的速度。

  例如,假设已经设置了(clock.get_tick(30)),这说明你想按30fps的帧速率运行。如果使用clock.get_fps()并发现只得到速率为20fps,可以知道:屏幕上对象移动的速度比你希望的要慢。因为每秒的帧数更少,所以每一帧必须把对象移动得更远,这样看上去才跟得上预想的速度,你的移动对象可能有一个名为speed的变量(或属性),这会告诉它们每一帧移动多远,只需要增加speed对运行速度较慢的机器做出补偿。

  要增加多少呢?可以按期望帧频率与实际帧速率的比值来增加,如果对象的当前速度是0,期望的帧速率是30fps,程序实际运行速率为20fps,可以得到:

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

  所以并不是每帧要将对象移动10个像素,而是需要移动15个像素,才能弥补较慢的帧速率,我们将在本书后面的一些程序中使用这个技巧。

  下面的沙滩球程序使用了前面几节讨论的内容:Clock和get_fps()

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

  你可能已经注意到,代码清单17-4的末尾的while循环中使用了whie1,而不是像代码清单17-3中那样使用while True。它们的作用完全相同。检查True或False(像在while语句中一样),值0、None以及空串或空列表都看作是False,所有其他值都作为True。所以1=True,也正是因为这个原因,while1等同于while True。这两种写法在Python中都很常用。

  如果你运行程序的方式不同,可能还会发现别的问题,如果使用SPE,并使用“Run in terminal without arguments”来运行程序,结束Pygame程序时终端窗口可能关闭,所以你看不到打印帧速率的print语句的输出,有两种方法可以解决这个问题。

  使用Run without arguments(CTRL-Shift-R)运行程序,你会在SPE shell窗口中看到print语句的输出(在SPE的文本编辑器窗口下面)

  在Print语句后面增加一个延迟,比如:pygame.time.delay(5000).这会在终端窗口关闭之前给你留5秒钟的时间读输出。

  终端窗口可能会一直处于打开状态(这要看你使用什么系统),在我的系统上,必须在结束Pygame程序之后手动关闭终端窗口。

  Pygame和动画精灵的基本知识就介绍完了。在下一章中,我们将使用Pygame建立一个真正的游戏,我们还会介绍另外一些你能完成的工作,比如增加文本(显示游戏得分)、声音和鼠标及键盘输入。

  你学到了什么

  在这一章,你学到了以下内容。

  Pygame中的动画精灵,以及如何使用动画精灵处理多个移动的图像。

  动画精灵组

  碰撞检测

  Pygame.clock和帧速率。

  测试题

  1、 什么是碰撞检测?

  2、 什么是像素完美碰撞检测?它与矩形碰撞检测有什么区别?

  3、 可以利用哪两种方法跟踪多个在一起的动画精灵对象?

  4、 在代码中控制动画的速度有哪两种方法?

  5、 为什么使用pygame.clock比使用pygame.time.delay()更准确?

  6、 怎么得出你的程序运行的帧速率?

  动手试一试

  键入这一章中的所有代码示例就能让你试个够,如果还不够,可以回过头再做一遍。相信你能从中得到很多收获!

评论关闭