![v2-250ac2140a3c4318c7ff6f78d8a0e6d3_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6edba71b-cb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-250ac2140a3c4318c7ff6f78d8a0e6d3_1440w.jpg?source=172ae18b)
在Python《外星人入侵》游戏<六>中,我们已经成功的在屏幕上创建了外星人群。但目前,都只是静态的展示,并没有动起来。
这一次,我们要实现的功能是,让外星人群左右和向下移动。
首先让外星人群向右移动,当碰到右边屏幕边缘的时候,向下移动一定距离,然后再向左移动,碰到左边屏幕边缘的时候,向下移动一定距离,再向相反方向移动。重复这个过程,直到所有外星人被消灭,或者有外星人碰到了飞船,或者是触碰到了屏幕的底部边缘。
向右移动外星人群
首先在settings.py中添加一个控制外星人速度的设置。
class
在alien.py中创建一个update()函数,来更新外星人的位置。
"""更新外星人的位置"""
每次更新外星人的位置,都是将外星人向右移动,每次外星人移动的量都是ai_settings.alien_speed_factor的值。
不过每次都是使用self.x来记录每个外星人的准确位置,因为这个属性是可以存储小数值的。
最后使用self.x的值来更新外星人的rect的位置。
在game_functions.py中定义函数update_aliens(aliens),用来更新外星人群中每个外星人的位置。
"""更新外星人的位置"""
这里是对编组aliens调用update()方法,将会自动对编组中的每个外星人调用update()方法。
最后我们需要在alien_invasion.py的while循环中调用update_aliens()。
"""游戏循环体"""
![v2-fbca3b92bd18ee21ad85a6775b8a90fe_b.gif](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6edba71b-cb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-fbca3b92bd18ee21ad85a6775b8a90fe_b.gif)
判断外星人是否撞到了屏幕边缘
现在我们发现,外星人向右移动的时候,是可以穿过屏幕的右边缘的。
我们需要设置下,当外星人群到达屏幕右边缘或左边缘的时候,怎么办?
在alien.py模块中定义一个函数,当外星人群到达屏幕边缘的时候,就返回True。
alien.py
def
在settings.py中为外星人添加一个方向设置:
self
我们使用fleet_direction表示外星人运动的方向,1表示外星人群向右,-1表示外星人群向左。
定义了一个变量fleet_drop_speed,表示有外星人撞到边缘时,外星人群向下移动的速度。
还要修改update()方法,让外星人的速度乘以方向。速度为正,表示外星人群向右运动,速度为负,表示外星人群向左运动。
"""更新外星人的位置"""
向下移动外星人群并改变移动方向:
当有外星人碰到屏幕边缘的时候,需要将外星人群下移,并改变他们的移动方向。我们在game_functions.py模块中,定义一个函数change_fleet_direction()来实现这个功能。
def
我们还需要检测有没有外星人到达左边缘或右边缘,如果有的话,就需要调用change_fleet_direction()函数,然后使用break终止程序。
def
我们使用for循环遍历外星人编组中的所有外星人,只要有一个外星人满足条件alien.check_edges(),即有外星人触碰到屏幕左边缘或者右边缘,就会调用change_fleet_direction()函数,将外星人群下移,并改变运动方向。然后使用break,跳出循环。
def
最后在update_aliens()中调用check_fleet_edges()方法,每次更新显示外星人群的时候,就需要判断是否有外星人触碰到屏幕边缘。
"""更新外星人的位置"""
最后,我们还需要在alien_invasion.py的while循环中将ai_settings作为实参传递给update_aliens()函数。
"""游戏循环体"""
![v2-0b2ead543bfb4d2b958c69fd25cf9eba_b.gif](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6edba71b-cb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-0b2ead543bfb4d2b958c69fd25cf9eba_b.gif)
文章参考书籍《Python编程:从入门到实践》
尝试一下,外星人群就开始移动起来了。
下一次,我们将实现飞船对外星人的射击功能。