如果想让球看起来会在窗口的边界反弹,就要知道它什么时候“碰到”窗口边界,然后让它朝反方向移动。如果想让球一直来回移动,就要在窗口左右两边都做同样的处理。
在左边界,这很容易,因为我们只需要检查球的位置是不是等于 0(或者某个很小的数)。
在右边界,就要查看球的右边界是不是在窗口的右边界上。不过,球的位置是按它的左边界(左上角)而不是右边界设置的。所以必须减去球的宽度:
球向窗口右边移动时,位置达到 550 时要将它反弹(让它朝反方向移动)。
为了让事情变得简单一些,我们要对代码做一些修改。
我们希望球永远来回反弹(或者直到我们关闭 Pygame 窗口)。因为已经有了一个
while
循环,只要窗口打开,这个while
循环就一直运行,所以我们要把显示球的代码移到这个循环内部(这就是程序最后一部分中的while
循环)。并不总是将球的位置增加 5,我们会建立一个新变量
speed
,用来确定每次迭代时以多快的速度移动球。我还打算把这个值设置为 10,让球稍稍加快速度。
新代码见代码清单 16-14。
代码清单 16-14 让沙滩球反弹
让球在窗口两边反弹的关键是第 19 行和第 20 行。通过第 19 行的代码(if x> screen.get_width-90orx<0:
),检查球是否在窗口边界上,如果是,就在第 20 行让它的方向反转(x_speed=-x_speed
)。
试试看效果怎么样。
在 2D 空间中反弹
到目前为止,我们只是让球来回移动,或者说这只是一个方向上的运动。现在,让它同时还会上下移动。为达到这个目的,只需要再做一些修改,如代码清单 16-15 所示。
代码清单 16-15 在 2D 空间中让沙滩球反弹
我们在前面的程序中增加了第 9 行(y_speed=10
)、第 18 行(y=y+y_speed
)、第 21 行(ify> screen.get_height-90ory<0:
) 和 第 22 行(y_speed=-y_speed
)。现在试试看效果怎么样!
如果想让球慢下来,有几种方法可以做到。
可以减少速度变量(
x_speed
和y_speed
)。这会减少每一个动画步中球移动的距离,所以运动也会更流畅。还可以增加延迟设置。在代码清单 16-15 中,延迟是 20。这是以毫秒为单位,也就是千分之一秒。所以每次循环时,程序会等待 0.02 秒。如果增加这个数值,运动会变慢。如果减少这个数值,运动就会加速。
可以试着改变速度和延迟来看最后的效果。