看了课本和几个实例,发现还是使用精灵中的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)
下节实现敌机的移动