1.1 精灵 和 精灵组
在刚刚完成的案例中,图像加载、位置编号、绘制图像 都需要程序员编写代码分别处理。
为了简化开发步骤: pygame 提供两个类。
pygame.sprite.Sprite — 存储 图像数据 Image 和 位置 rect 的 对象。
pygame.sprite.Group()
1.2 派生精灵子类
1.新建 plane_sprites.py 文件;
2.定义 GameSprite 继承自 pygame.sprite.Sprite;
注意:
如果一个类的 父类 不是 object;
在重写 初始化方法 时,一定要 先 super() 一下父类的 init 方法;
保证父类中实现的 init 代码能够被正常执行。
属性
image 精灵图像,使用 image_name 加载;
rect 精灵大小,默认使用图像大小;
speed 精灵移动速度,默认为1;
方法
update 每次更新屏幕时在游戏循环内使用;
让精灵的 self.rect.y ==self.speed
提示
image 的 get_rect() 方法,可以返回pygame.Rect(0,0,图像宽,图像搞)的对象。
1.3 使用 游戏精灵 和 精灵组 创建敌机
需求
使用刚刚派生的 游戏精灵 和 精灵组 创建 敌机 并且实现敌机动画。
步骤:
1、使用 from 导入 plane_sprites 模块
from 导入的模块可以 直接使用;
import 导入的模块需要通过 模块名,来使用
2、在 游戏初始化 创建 精灵对象 和 精灵组对象;
3、在 游戏循环中 让 精灵组 分别调用 update() 和 draw(screen) 方法;
职责
精灵:
封装 图像image、位置rect 和 speed;
提供 update() 方法,根据游戏需求,更新位置rect;
精灵组:
包含 多个 精灵对象;
update 方法,让精灵组中的所有精灵调用 update 方法更新位置;
draw(screen) 方法,在 screen 上绘制精灵组中的所有精灵;
import pygame
from plane_sprites import *
# 游戏的初始化
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480,700))
# 绘制背景图像
# 1>加载图像数据
bg = pygame.image.load("./images/background.png")
# 2>blit 绘制图像
screen.blit(bg,(0,0))
# 3>update 更新屏幕显示
#pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero,(200,500))
# 可以在所有绘制工作完成之后,统一调用update 方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 定义 Rect 记录飞机的初始位置
hero_rect = pygame.Rect(200,500,102,126)
# 创建敌机的精灵
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("游戏退出")
# quit 卸载所有的模块
pygame.quit()
# exit()
exit()
# 捕获事件
event_list = pygame.event.get()
if len(event_list) > 0:
print(event_list)
# 修改飞机的位置
hero_rect.y -= 1
# 判断飞机的位置
if hero_rect.y <=0:
hero_rect.y = 700
# 调用blit方法绘制图像
screen.blit(bg,(0,0))
screen.blit(hero,hero_rect)
# 让精灵组调用两个方法
# update - 让组中的所有精灵更新位置
enemy_group.update()
# draw - 在screen上绘制所有的精灵
enemy_group.draw(screen)
# 调用update方法更新显示
pygame.display.update()
pygame.quit()