前面我们看过了怎么实现子弹类,今天我们就来看下怎么将外星人显示在屏幕。
import pygame
from pygame.sprite import Sprite
import random
class Alien(Sprite):
def __init__(self, screen, settings):
super().__init__()
# 将要绘制的屏幕
self.screen = screen
# 设置飞船图片路径
self.alien_image_path = 'images/alien.png'
# 创建外星人
self.alien = pygame.image.load(self.alien_image_path)
# 重新设置外星人surface大小,如果制作的图片没有问题,这一步可以省略,我是不擅长作图,只能自己处理一下了
self.alien = pygame.transform.scale(self.alien, (48, 36))
# 获取外星人surface外接矩形
self.rect = self.alien.get_rect()
# 外星人初始位置,间隔坐标原点一个外星人的宽度
row = random.randint(1, int(settings.screen_width / self.rect.width)-1)
self.rect.x = self.rect.width * row
# 外星人初始位置,间隔坐标原点一个外星人的高度
self.rect.y = self.rect.height
# 存储精确位置
self.alien_y = float(self.rect.y)
# 外星人移动速度
self.speed_factor = 0.1
def update(self):
self.alien_y += self.speed_factor
self.rect.y = self.alien_y
def blitme(self):
"""
绘制外星人
"""
self.screen.blit(self.alien, self.rect)
这里绘制函数和前面飞船,子弹类的实现没什么区别。解释一下:
# 外星人初始位置,间隔坐标原点一个外星人的宽度
row = random.randint(1, int(settings.screen_width / self.rect.width)-1)
self.rect.x = self.rect.width * row
这里我们根据屏幕宽度和外星人的宽度,计算出屏幕最多可容纳多少个外星人,然后在使用随机数确定这个外星人的x坐标位置。当然了,使用随机数会出现在几个外星人重叠的现象。
同样我们在更新屏幕的函数里添加外星人的绘制操作:
# 绘制外星人
for alien in self.aliens.sprites():
alien.blitme()
最后,我们在修改一下更新操作:
def update_aliens(self):
"""
更新外星人
"""
self.aliens.update()
# 检测是否飞出底部
for alien in self.aliens.copy():
if alien.rect.bottom > self.screen.get_rect().bottom:
self.aliens.remove(alien)
# 限制同时出现的外星人数目
if len(self.aliens) < 8:
self.aliens.add(Alien(self.screen, self.settings))
# spritecollideany返回发生碰撞的精灵
collision = pygame.sprite.spritecollideany(self.air_ship, self.aliens)
# 如果外星人和飞船发生碰撞,删除外星人
if collision:
print(collision)
self.aliens.remove(collision)
运行效果: