Pygame实战之外星人入侵NO.7——大批外星人来袭

上次我们创建了一个外星人,现在要大批量生产了……

首先我们要创建外星人群,在game_functions.py中增加一个函数creat_aliens,由于后期进行了代码重构,所以呈上最终结果吧:

def get_nuber_alien_x(ai_settings,alien_width):
    '''屏幕每一行可容纳外星人的数量'''
    space_x=ai_settings.screen_width-2*alien_width #屏幕上一行可以显示外星人的空间为屏幕的宽度减去两个外星人的宽度,即两端的空隙
    numbers_alien_x=int( space_x/(2*alien_width) )#每一行显示外星人的数量,每个外星人占两个宽度,一个显示自身,另一个为两个外星人的间隔
    return numbers_alien_x   
def get_number_rows(ai_settings,ship_height,alien_height):
    '''计算屏幕一共可以容纳多少行外星人'''
    space_y=(ai_settings.screen_height-3*alien_height-ship_height) #垂直方向可用的空间
    number_rows=int( space_y/(2*alien_height) )  #可显示外星人的行数
    return number_rows
def cre_alien(ai_settings,screen,aliens,alien_number,num_row):
    '''创建一个外星人并将其加入到当前行的正确位置'''
    alien=Alien(ai_settings,screen)
    alien_width=alien.rect.width  #获取一个外星人的宽度
    alien.x=alien_width+2*alien_width*alien_number  #设置每个外星人在当前行的位置
    alien.y=alien.rect.height+2*alien.rect.height*num_row  #设置各行外星人在垂直方向的位置
    alien.rect.x=alien.x
    alien.rect.y=alien.y
    aliens.add(alien)                  
def creat_aliens(ai_settings,screen,aliens,ship):
    '''创建一群外星人'''
    alien=Alien(ai_settings,screen)
    numbers_alien_x=get_nuber_alien_x(ai_settings,alien.rect.width) #每一行能装载的外星人数量
    number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)  #屏幕能装载的行数
    for num_row in range(number_rows): #循环多行
        for alien_number in range(numbers_alien_x): #处理每一行的外星人
             cre_alien(ai_settings,screen,aliens,alien_number,num_row)
def update_screen(ai_settings,screen,ship,bullets,aliens):
    screen.fill(ai_settings.bg_color)  #调用属性设置屏幕的填充颜色
    for bullet in bullets.sprites():  #对每个bullets中的小妖怪都调用draw_bullet()方法,重绘所有子弹
        bullet.draw_bullet()
    ship.blitme()  #显示飞船
    aliens.draw(screen) #在屏幕上绘制编组中的每个外星人
    pygame.display.flip()  #是最近绘制的屏幕可见
一共有五个函数,前三个是为第四个服务的,第五个实现将外星人显示到屏幕上,注释比较清楚了,一开始先创建一行外星人,这里边涉及到了位置的设定,然后是多行外星人,保证飞船和外星人群之间有足够的间隔,大体就是这样。。这里还有一个问题就是函数cre_alien中的alien.rect.y=alien.y这条语句,第一次运行时没有加这条,结果没有报错,但结果却不对,没有正常显示,之前对这个就有些疑问,关于rect的x和其本身的x的关系,记得刚开始就提到过,pygame为了方便处理不规则图形,都是以矩形来表示图形的,也就是说相当于在图形外围加了一个矩形框,这样更方便直接地表示了该图形。一般情况下一个物体的rect的xy坐标应该和其自身的xy坐标差不多吧。。这是我的想法,还会进一步验证的。

最后在主程序中进行相关函数的调用:

def run_game():
    pygame.init()  #初始化背景设置
    ai_settings=Settings()  #实例化
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) #调用属性设置屏幕的宽高
    pygame.display.set_caption("Alien Invasion")  #设置标题
    ship=Ship(screen,ai_settings)  #实例化Ship
    bullets=Group() #创建一个存储子弹的组
    aliens=Group() #创建一个存储所有外星人的空编组
    gf.creat_aliens(ai_settings,screen,aliens,ship)
    while True:
        gf.check_events(ship,ai_settings,screen,bullets) #更改事件监听函数
        ship.update()  #每次循环都访问该函数,保证飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新
        gf.update_bullets(bullets)    
        gf.update_screen(ai_settings,screen,ship,bullets,aliens)    

最终效果如下:

由于对宽度进行了取整操作,所以大家看到右端空隙较大,这个无伤大雅,反而会使得游戏更有意思,具体的下次再见~~

猜你喜欢

转载自blog.csdn.net/u014483914/article/details/80257829