美文网首页
【python3小白上路系列】让敌人动起来~

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

作者: Charles_DT | 来源:发表于2020-08-24 10:33 被阅读0次

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

    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)
    

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

    相关文章

      网友评论

          本文标题:【python3小白上路系列】让敌人动起来~

          本文链接:https://www.haomeiwen.com/subject/llvgjktx.html