Pygame 外星人入侵(7)外星人压境
目录
在之前的博文中,实现了在屏幕上绘制一大群外星人,现在我们想让这群外星人动起来,它们的移动遵循着一定的规律。
一、外星人单向移动
我们首先要实现的是,如何让一群外星人一起向屏幕右侧移动。
1、设置外星人移动速度
游戏参数性质的变量统一存放在 设置模块中的设置类中
# 6、外星人的属性
# 6。1 外星人移动的速度
self.alien_speed = 1
2、更新外星人的位置
在 Alien 类中定义修改外星人位置的方法
# 更新外星人位置的方法
def update(self):
self.x += self.settings.alien_speed * self.settings.fleet_direction
self.rect.x = self.x
3、修改主模块
之前我们是通过 update_aliens() 方法来绘制外星人群到屏幕上的,现在我们不仅要在这个方法中绘制初始外星人,还要移动它们的位置,因此,需要调用刚才定义的修改位置的方法
# 更新外星人位置的方法
def update_aliens(aliens, settings):
aliens.update()
此时,我们就实现了整群的外星人向屏幕外移动,它们会逐渐飞离屏幕,直到看不见为止。
二、更加合理地移动
像刚才那样单向移动直到飞出屏幕外的移动方式显然需要改进,我们尝试定义外星人移动的规则:
1、初始时,向右移动,直到屏幕边缘
2、当外星人到达屏幕边缘时,向下移动一段距离,然后向左移动
3、与1、2同理,但方向相反
这样就可以实现让外星人群不断左右来回移动,且慢慢逼近飞船的效果。
1、碰撞检测
这个规则中很重要的一点就是,需要检测外星人和屏幕之间的碰撞,因此单独定义一个方法来检测外星人和屏幕是否发生碰撞
class Alien(self):
...
# 检查外星人是否达到屏幕边界的方法
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.x >= screen_rect.width:
return True
elif self.rect.x <= 0:
return True
当飞船的横坐标超过屏幕右边界或者超过左边界时,视为碰撞到了。
2、碰撞后的业务
当外星人碰撞到边界后,需要的事有:
1、马上向下移动一段距离
2、改变原来的移动方向
这里我们可以设置下移的速度,并且将移动方向作为设置保存起来
# 6.2 外星人下移的速度
self.alien_drop_speed = 10
# 6.3 外星人移动方向的标志 1为右移 -1为左移
self.fleet_direction = 1
有了这些设置,就可以定义碰撞后的业务了
# 当外星人群触碰到边界时,向下移动外星人群并改变移动方向的方法
def change_direction(aliens, settings):
for alien in aliens.sprites():
alien.rect.y += settings.alien_drop_speed
settings.fleet_direction *= -1
下移:遍历外星人,将其纵坐标加上下移的速度
转向:让设置的方向标志取相反数
同时,根据方向标志我们可以实现外星人的左移或右移,需要修改Alien类中的 update() 方法
# 更新外星人位置的方法
def update(self):
self.x += self.settings.alien_speed * self.settings.fleet_direction
self.rect.x = self.x
3、整群外星人的碰撞检测
现在,我们可以对单个外星人进行碰撞检测,并且实现了碰撞后的业务
那么接下来就是实现对整群外星人进行碰撞检测了
我们遍历整组外星人群,如果有任何一个到达了边界,那么整组外星人都要下移并转向
# 判断外星人群是否碰到边界,如果碰到了,则改变移动方向
def check_fleet_edges(aliens, settings):
for alien in aliens:
if alien.check_edges():
change_direction(aliens, settings)
# 只要有一个外星人到达边界,就不用再判断后续的外星人了
break
4、修改主模块方法
鉴于我们之前修改外星人位置都是在 update_aliens() 方法中实现的,所以此时我们也要修改这个方法,用于检测整组外星人,并作出相应的动作
# 更新外星人位置的方法
def update_aliens(aliens, settings):
check_fleet_edges(aliens, settings)
aliens.update()
三、小结
此时,我们运行游戏,就可以看到外星人群在不断左右来回移动,并在每次撞到边界后都向下移动的场景了,这里模拟了游戏里外星人入侵的功能。
由于编写代码时,就已经拆分了每个函数将要实现的功能,因此这里不太需要回头重构代码。