【python3小白上路系列】让敌人动起来~

2020-08-24  本文已影响0人  Charles_DT

昨晚实在是睡的不行,做了个噩梦,梦见把一个人的头用锤子砸成肉饼了。
今天抽空实现一下让敌人移动的功能吧,开始。

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)

运行一下吧!现在整群敌人开始移动了,下一节我们开始射杀敌人!

上一篇下一篇

猜你喜欢

热点阅读