pygame入门小游戏(外星人入侵(6) 外星飞船来啦!【二】)

看了课本和几个实例,发现还是使用精灵中的groupcollide()来检测碰撞比较简单,所以我们接着第五节,把外星飞船也使用精灵来绘制,(上节因为并没有使用Sprite,感觉实现击落飞船有点困难,所以咱们接着5,继续)

首先创建一个存储外星飞船的类Alien()

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
    def __init__(self, screen):
        super().__init__()
        self.screen = screen
        #加载图像
        self.image = pygame.image.load(r'images\alien.bmp')
        self.rect = self.image.get_rect()
        #每个敌机出现在屏幕左上角附近
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
        #储存敌机位置(后面会使用)
        self.x = float(self.rect.x)
    #在指定位置画出alien   
    def blit_alien(self):
        self.screen.blit(self.image, self.rect)

主程序中需要创建一个外星人
alien = Alien(screen)

还要在update_screen()中调用blit_alien 才能让它出现在屏幕上

def update_screen(my_setting, screen, ship, bullets, alien):
    ...............................
    alien.blit_alien
    .....................

运行程序,如图
这里写图片描述
一架孤独的敌机出现在屏幕上, 何不多添加些外星飞船

接下来创建一外星人群(可在g_fun.py中创建)


from alien import Alien

......................
#创建外星人群
def alien_fleet(screen, aliens):

    alien = Alien(screen)
    alien_width = alien.rect.width
    #计算一行可以容下多少外星飞船(可以自己调节参数来确定合适的数量)
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))


    for alien_number in range(number_aliens_x):

        alien = Alien(screen)
        alien.x = alien_width + 1.2 * alien_width * alien_number
        alien.rect.x = alien.x
        aliens.add(alien)

对了, 主程序中也需要少许改动

alien = Alien(screen)——>aliens = Group()
ck.alien_fleet(screen, aliens)[调用此函数]

alien.blit_alien——> aliens.draw(screen)
draw()用来绘制编组中的所有外星人

效果如下
这里写图片描述

为了实现多行外星飞船的出现,我们重构下alien_fleet()

def get_number_aliens_x(alien_width):
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))
    return number_aliens_x
def create_alien(screen, aliens, alien_number):
    alien = Alien(screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 1.2 * alien_width * alien_number
    alien.rect.x = alien.x
    aliens.add(alien)
def alien_fleet(screen, aliens):
    alien = Alien(screen)
    number_aliens_x = get_number_aliens_x(alien.rect.width)
    for alien_number in range(number_aliens_x):
        create_alien(screen, aliens, alien_number)

接下来要计算屏幕可以容纳多少行敌机,思想与每行能容纳多少敌机类似
更新后的程序

#计算容纳多少行敌机
def get_number_rows(ship_height, alien_height):
    available_space_y = (600 - (3 * alien_height) - ship_height)
    number_rows = int((available_space_y) / (2 * alien_height))
    return number_rows
def get_number_aliens_x(alien_width):
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))
    return number_aliens_x
def create_alien(screen, aliens, alien_number, row_number):
    alien = Alien(screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 1.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)
def alien_fleet(screen, aliens, ship):
    alien = Alien(screen)
    number_aliens_x = get_number_aliens_x(alien.rect.width)
    number_rows = get_number_rows(ship.rect.height,
        alien.rect.height)
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(screen, aliens, alien_number, row_number)

由于在alien_fleet()中使用了ship,我们在主程序中调用alien_fleet()时需要传递参数ship
ck.alien_fleet(screen, aliens, ship)

运行程序,如下
这里写图片描述

下节实现敌机的移动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值