上次说到了事件监听,那么我们先说一下游戏窗口该如何退出。
有一段相对固定的代码
while True:
# 指定循环体内部代码执行频率
clock.tick(60)
# 事件监听
for event in pygame.event.get():
# 判断用户是否点击了关闭按钮
if event.type == pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()
我们知道 pygame.event.get()方法返回的是一个事件列表,那么我们用 for 循环来遍历这个列表,再判断我们想要进行的事件是否在发生的事件列表中,就可以进行想要的操作。
精灵和精灵组
在之前的代码中我们做了一些添加图片的操作,但是当图片比较多的时候,就会比较麻烦,
Python中有两个类,简化我们的操作
pygame.sprite.Sprite -- 存储图像数据 image 和位置 rect 的对象
pygame.sprite.Group
精灵组中有 update 和draw 方法
draw 方法会让精灵组中所有精灵的 image绘制到 surface 上的rect 位置
当精灵组调用这两个方法是,精灵组中所有的精灵元素将同时执行操作
派生精灵子类
- 新建fly_sprites.py 文件
- 定义 GameSprite 继承自pygame.sprite.Sprite
注意:
- 如果一个类的父类不是 object,在重写初始化方法时,要先 super()一下父类的 __init__方法
- 保证父类中实现的 __init__ 代码能够正常被执行
附上代码
import pygame
class GameSprite(pygame.sprite.Sprite):
"""
飞机大战游戏精灵
"""
def __init__(self, image_name, speed=1):
# 调用父类的初始化方法
super().__init__()
# 定义属性
self.image = pygame.image.load(image_name)
self.rect = pygame.image.get_rect()
self.speed = speed
def update(self, *args):
# 在垂直方向向上移动
self.rect.y += self.speed
接下来用游戏精灵和精灵组创建一个敌机
附上代码
# -*- coding: utf-8 -*-
import pygame as pygame
from fly_sprites import *
pygame.init()
# 定义飞机大战游戏窗口,设置窗口宽高
fly_screen = pygame.display.set_mode((480,700))
# 绘制背景图像
# 1.加载图像数据
background = pygame.image.load("./images/background.png")
# 2.blit方法绘制图像
fly_screen.blit(background,(0,0))
# 3.update更新屏幕显示
# pygame.display.update()
# 绘制飞机图像
fly_hero = pygame.image.load("./images/me1.png")
hero_rect = pygame.Rect(150,500,102,126)
fly_screen.blit(fly_hero,hero_rect)
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 创建敌机的精灵
enemy = GameSprite("./images/enemy1.png")
enemy1 = GameSprite("./images/enemy1.png",2)
# 创建敌机的精灵组
enemy_group = pygame.sprite.Group(enemy,enemy1)
# 游戏循环--游戏正式开始
while True:
# 指定循环体内部代码执行频率
clock.tick(60)
# 事件监听
for event in pygame.event.get():
# 判断用户是否点击了关闭按钮
if event.type == pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()
# 修改飞机位置
hero_rect.y -= 1
# 判断飞机的位置 botten = y+height
if hero_rect.bottom <= 0:
hero_rect.y = 700
# 调用blit方法绘制图像
fly_screen.blit(background,(0,0))
fly_screen.blit(fly_hero,hero_rect)
# 精灵组调用两个方法
enemy_group.update()
enemy_group.draw(fly_screen)
# 更新显示
pygame.display.update()
pygame.quit()
附上结果图