导入第三方库
pip install pygame 1.9.6
import pygame
import random
定时器以及子弹
ENEMY_EVENT = pygame.USEREVENT # 敌机定时器常量
FIRE = pygame.USEREVENT + 1 # 子弹类
游戏精灵 以及背景精灵
class GameSprite(pygame.sprite.Sprite):
# 飞机大战游戏精灵
def __init__(self, image_name, speed=1):
# 调用父类初始化方法
super().__init__()
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect() # (0,0, 480, 700)
self.speed = speed
def update(self, *args):
# 在屏幕的垂直方向向下移动
self.rect.y += self.speed
class Background(GameSprite):
def __init__(self, is_alt=False):
super().__init__('./images/background.png')
# is_alt判断是否是交替图像,如果不是,需要设置初识位置
# (也就是不能让两张背景重叠)
if is_alt:
self.rect.y = -self.rect.height
def update(self):
# 调用父类方法实现
super().update()
# 判断是否移出屏幕,如果移出,将图像设置到屏幕上方
if self.rect.y >= 700:
self.rect.y = -self.rect.height
写敌机飞出屏幕 删除 以及被击中
class Enemy(GameSprite):
# 1.调用父类方法,创建敌机精灵,同事指定敌机图片
def __init__(self):
super().__init__('./images/enemy1.png')
# 2.指定敌机的初始化速度
self.speed = random.randint(1, 4) # 随机的选一个速度
# 3.指定敌机的随机位置
self.rect.bottom = 0
max_x = 480 - self.rect.width
self.rect.x = random.randint(0, max_x)
def update(self):
super().update()
# 判断是否飞出屏幕
if self.rect.y >= 700:
print('飞出屏幕,从精灵组删除')
self.kill() # 可以将精灵从所在的精灵组中删除
# __del__ 内置方法会在对象被销毁前调用,可以用于判断对象是否被销毁
def __del__(self):
print('敌机挂了%s' % self.rect)
写英雄飞机
class Hero(GameSprite):
def __init__(self):
super().__init__('./images/me1.png')
# 初始化 英雄位置
self.rect.y = 700 - self.rect.height - 30 # 整个屏幕的高 剪去 图片高度 -30 距离底部30
self.rect.x = 240 - self.rect.width // 2
# 创建子弹精灵组
self.bullet_group = pygame.sprite.Group()
# def update(self):
# self.rect.x = self.speed
# if self.rect.x < 0:
# self.rect.x = 0
# elif self.rect.x > 480 - self.rect.width:
# self.rect.x = 480 - self.rect.width
# # # super().update()
# self.rect.y += self.speed
# if self.rect.y < 0:
# self.rect.y = 0
# elif self.rect.y > 700 - self.rect.height:
# self.rect.y = 700 - self.rect.height
def fire(self):
print('发射子弹')
for i in range(3):
# 创建子弹精灵
bullet = Bullet()
# 设置精灵的位置
bullet.rect.bottom = self.rect.y - i*20
bullet.rect.centerx = self.rect.centerx
# 将子弹添加到精灵组
self.bullet_group.add(bullet)
# 子弹需求
# 子弹从英雄飞机的正上方发射 直线飞行
# 飞出屏幕之后从精灵组中删除
# 初始化方法 子弹图片 初始速度 -2
# update() 判断是否飞出屏幕,如果是,从精灵组删除
class Bullet(GameSprite):
def __init__(self):
# 调用父类方法 设置子弹图片,设置初速速度
super().__init__('./images/bullet1.png', -2)
def update(self):
super().update()
# 判断是否飞出屏幕
if self.rect.bottom < 0:
self.kill()
def __del__(self):
print('子弹被销毁%s' % self.rect)
# 捕捉 按键控制飞机左右移动
# 通过pygame.key.get_pressed() 返回所有按键元祖
# 通过键盘常量 判断元祖中某个键是否被按下 ,如果按下,对应数值为1
# if keypressed [pygame.K_RIGHT]: # 判断 向右的键是否被按下