昨晚实在是睡的不行,做了个噩梦,梦见把一个人的头用锤子砸成肉饼了。
今天抽空实现一下让敌人移动的功能吧,开始。
2.4 让敌人移动
下面来让敌人群在屏幕上向右移动,撞到屏幕边缘后下移一定的距离,再沿相反的方向移动。我们将不断地移动所有的敌人,直到所有敌人都被消灭,有敌人撞上飞船,或有敌人抵达屏幕底端。下面先来让敌人向右移动。
2.4.1 向右移动敌人
首先我们要在setting中增加一个敌人速度的设置
#敌人设置
self.alien_speed_factor = 1
然后用这个设置更新update():
def update(self):
#向右移动敌人
self.x += self.ai_settings.alien_speed_factor
self.rect.x = self.x
每次更新敌人位置时,都将它向右移动,移动量为alien_speed_factor 的值。我们使用属性self.x 跟踪每个敌人的准确位置,这个属性可存储小数值。然后,我们使用self.x 的值来更新敌人的rect 的位置。 在主while 循环中已调用了更新飞船和子弹的方法,但现在还需更新每个敌人的位置:
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(aliens)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
最后我们需要在game_function模块中增加update_aliens函数:
def update_aliens(aliens):
#更新所有敌人位置
aliens.update()
现在运行游戏的话, 会看到敌人整体向右移动,然后消失在窗口中。
2.4.2 创建表示敌人移动方向的设置
下面来创建让敌人撞到屏幕右边缘后向下移动、再向左移动的设置。实现这种行为的代码如下:
#敌人设置
self.alien_speed_factor = 1
self.fleet_drop_speed = 10
#fleet_direction为1表示向右移,-1表示向左移
self.fleet_direction = 1
2.4.3 检查敌人是否撞到了屏幕边缘
现在需要编写一个方法来检查是否有敌人撞到了屏幕边缘,还需修改update() ,以让每个敌人都沿正确的方向移动:
def update(self):
#向右移动敌人
self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
self.rect.x = self.x
def check_edges(self):
#如果敌人位于屏幕边缘,就返回True
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True
首先我们修改了update函数,把敌人的速度乘了一个方向参数,这里符合我们刚才的定义,如果向左移动则移动距离为负,反之,向右移动移动距离为正。
接着我们定义了check_edges函数,如果敌人的rect 的right 属性大于或等于屏幕的rect 的right属性,就说明敌人位于屏幕右边缘。如果敌人的rect 的left 属性小于或等于0,就说明敌人位于屏幕左边缘。
2.4.4 向下移动敌人并改变移动方向
有敌人到达屏幕边缘时,需要将整群敌人下移,并改变它们的移动方向。我们需要对game_functions.py做重大修改,因为我们要在这里检查是否有敌人到达了左边缘或右边缘。为此,我们编写函数check_fleet_edges() 和change_fleet_direction() ,并对update_aliens() 进行修改:
def update_aliens(ai_settings,aliens):
#更新所有敌人位置
check_fleet_edges(ai_settings,aliens)
aliens.update()
def check_fleet_edges(ai_settings,aliens):
# 有外星人到达边缘时采取相应措施
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings,aliens)
break
def change_fleet_direction(ai_settings,aliens):
# 将整群外星人下移,并改变他们的方向
for alien in aliens.sprites():
alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1
最后别忘了修改主函数中,update_aliens()的参数。
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(ai_settings,aliens)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
运行一下吧!现在整群敌人开始移动了,下一节我们开始射杀敌人!
网友评论