首页 » 与孩子一起学编程 » 与孩子一起学编程全文在线阅读

《与孩子一起学编程》16.9 让球反弹

关灯直达底部

如果想让球看起来会在窗口的边界反弹,就要知道它什么时候“碰到”窗口边界,然后让它朝反方向移动。如果想让球一直来回移动,就要在窗口左右两边都做同样的处理。

在左边界,这很容易,因为我们只需要检查球的位置是不是等于 0(或者某个很小的数)。

在右边界,就要查看球的右边界是不是在窗口的右边界上。不过,球的位置是按它的左边界(左上角)而不是右边界设置的。所以必须减去球的宽度:

球向窗口右边移动时,位置达到 550 时要将它反弹(让它朝反方向移动)。

为了让事情变得简单一些,我们要对代码做一些修改。

 
  • 我们希望球永远来回反弹(或者直到我们关闭 Pygame 窗口)。因为已经有了一个 while 循环,只要窗口打开,这个 while 循环就一直运行,所以我们要把显示球的代码移到这个循环内部(这就是程序最后一部分中的 while 循环)。

  • 并不总是将球的位置增加 5,我们会建立一个新变量 speed,用来确定每次迭代时以多快的速度移动球。我还打算把这个值设置为 10,让球稍稍加快速度。

新代码见代码清单 16-15。

代码清单 16-15 让沙滩球反弹

让球在窗口两边反弹的关键是第 18 行和第 19 行。通过第 18 行的代码(if x> screen.get_width-90orx<0:),检查球是否在窗口边界上,如果是,就在第 19 行让它的方向反转(x_speed=-x_speed)。

试试看效果怎么样。

在 2-D 空间中反弹

到目前为止,我们只是让球来回移动,或者说这只是一个方向上的运动。现在,让它同时还会上下移动。为达到这个目的,只需要再做一些修改,如代码清单 16-16 所示。

代码清单 16-16 在 2-D 空间中让沙滩球反弹

我们在前面的程序中增加了第 9 行(y_speed=10)、第 17 行(y=y+y_speed)、第 20 行(ify> screen.get_height-90ory<0:) 和 第 21 行(y_speed=-y_speed)。现在试试看效果怎么样!

如果想让球慢下来,有几种方法可以做到。

 
  • 可以减少速度变量(x_speedy_speed)。这会减少每一个动画步中球移动的距离,所以运动也会更流畅。

  • 还可以增加延迟设置。在代码清单 16-16 中,延迟是 20。这是以毫秒为单位,也就是千分之一秒。所以每次循环时,程序会等待 0.02 秒。如果增加这个数值,运动会变慢。如果减少这个数值,运动就会加速。

可以试着改变速度和延迟来看最后的效果。