基于pygame的射击小游戏制作(三)让外星人动起来

在本篇文章中,将学习如何创建一群外星人,如何使用嵌套循环来创建元素网格,如何移动外星人

1、编程思路

1.1 创建外星人

创建Alien.py 文件,该文件配置与Ship.py类似,每个外星人最初都出现在屏幕左上角。修改update_screen()里的形参,传递一个外星人实例,并在该函数中调用方法blitme,就可以让外星人出现在屏幕上。代码较多不一一赘述,具体源码附加在文章最后。

2.2 创建一群外星人

首先在alien——invasion.py中创建一个空编组aliens,用与存储全部外星人,在调用game_functions.py里的函数来创建外星人群。接下来编写函数create_fleet(),并将ai_settings、对象screen和空编组aliens传递给它。

def create_alien(ai_settings, screen, aliens, alien_number , row_number):
    """创建一个外星人并将其放在当前行"""
    alien = Alien(ai_settings, screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    aliens.add(alien)

create_fleet()函数主要是计算一行可以放置多少个外星人,用int()确保出现的外星人数量是整数。在for循环中,创建一个新的外星人,并通过设置x坐标将其加入当前行,将每个外星人都往右推一个外星人的宽度,将外星人宽度乘于2得到每个外星人占据的空间。就可以得到当前外星人在当前行的位置。最后吧新创建的外星人添加到编组aliens中。

def create_fleet(ai_settings, screen,ship , aliens):
    """创建外星人群"""
    #创建一个外星人,并计算一行可以容纳多少个外星人
    #外星人间距为外星人宽度
    alien = Alien(ai_settings, screen)
    number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
    number_rows = get_number_rows(ai_settings, ship.rect.height,
                                   alien.rect.height)
    #创建外星人群
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            #创建第一个外星人并加入当前行
            create_alien(ai_settings, screen, aliens,
                         alien_number, row_number)

添加多行外星人与添加一行外星人类似。需要计算出屏幕可以容纳多少行,并循环相应的次数。计算公式如:将屏幕高度减去第一行外星人的上边距(外星人高度)、飞船的高度以及最初外星人群与飞船的距离(外星人高度的两倍)。将可用垂直空间除以外星人高度的两倍留出空白区域,给玩家击杀的时间。

def get_number_rows(ai_settings, ship_height, alien_height):
    """计算屏幕可以容纳多少行外星人"""
    available_space_y = (ai_settings.screen_height -
                         (3 * alien_height) - ship_height)
    number_rows = int(available_space_y / (2 * alien_height))
    return number_rows
    
def get_number_aliens_x(ai_settings, alien_width):
    """计算每行可容纳多少个外星人"""
    available_space_x = ai_settings.screen_width - 2 * alien_width
    number_aliens_x = int(available_space_x / (2 * alien_width))
    return number_aliens_x

def create_alien(ai_settings, screen, aliens, alien_number , row_number):
    """创建一个外星人并将其放在当前行"""
    alien = Alien(ai_settings, screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    aliens.add(alien)
1.3让外星人移动

我们让外星人群在屏幕上向右移动,撞到屏幕边缘后下移一定的距离,再沿相反的方向移动。外星人将不断地移动,直到所有外星人都被消灭。
在setting.py中添加一个控制外星人速度的设置

self.alien_speed_factor = 1

然后在alien.py中添加update()来控制外星人移动。每次更新外星人位置时,外星人向右移动。

    def update(self):
        """向右移动外星人"""
        self.x += (self.ai_settings.alien_speed_factor
                   * self.ai_settings.fleet_direction)
        self.rect.x = self.x

我们需要外星人移动到桌面边缘时再向反方向移动并往下移动一行。在setting.py中设置移动速度,fleet_direction为1表示向右移,为-1表示向左移。编写if-elif语句来检查外星人群的移动方向。鉴于只有两个可能的方向,我们使用值1和-1来表示它们,并在外星人群改变方向时在这两个值之间切换。

        #外星人设置
        self.alien_speed_factor = 3
        self.fleet_drop_speed = 10
        #+1右移,-1左移
        self.fleet_direction = 1
1.4 检查外星人碰到屏幕边缘

通过check_edges()来检查外星人碰到屏幕边缘,如果外星人的rect的right属性大于或等于屏幕的rect的right属性,就说明外星人位于屏幕右边缘。如果外星人的rect的left属性小于或等于0,就说明外星人位于屏幕左边缘。
有外星人到达屏幕边缘时,需要将整群外星人下移,并改变它们的移动方向。编写check_fleet_edges()函数,对其中的每个外星人调用check_edges()。如果check_edges()返回True,说明该外星人位于屏幕边缘,需要改变其移动方向。change_fleet_direction()用来使外星人下移,下移的量也可以自己设置。

def check_fleet_edges(ai_settings, aliens):
    """外星人到达边缘时采取相应的措施"""
    for alien in aliens.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值