在本篇文章中,将学习如何创建一群外星人,如何使用嵌套循环来创建元素网格,如何移动外星人
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.