系列文章目录
- 项目准备
- 使用pygame 创建图形窗口
- 理解图像并实现图像绘制
- 理解游戏循环 和 游戏时钟
- 理解精灵 和精灵组
前言
今天是更新飞机大战项目准备,最有一个环节
理解精灵和精灵组
五、理解精灵和精灵组
5.1? 精灵和精灵组
·在刚完成的案例中,图像加载、位置变化、绘制图像 都需要程序员编写代码分别处理
·为了简化开发步骤,pygame 提供了两个类
- pygame.sprite.Sprite——存储图像数据image 和位置rect 的对象
- pygame.sprite.Group
简单一点来说:精灵和精灵组,就是为了方便程序员在开发项目时,代码太多,过于繁琐,可以使我们开发时,更加有效率?
5.2? 派生精灵子类
- 新建plane_sprites.py文件
- 定义GameSprite继承自pygame.sprite.Sprite
注意:
·如果一个类的父类不是 object
·在重写初始化方法时,一定要先 super() 一下父类__init__方法
·保证父类中实现的__init__代码能够被正常执行
属性
·image精灵图像,使用 image_name加载
·rect精灵大小,默认使用图像大小
·speed精灵移动速度,默认为1
方法
·update每次更新屏幕时在游戏循坏内调用
??让精灵组的 self.rest.y += self.speed
提示
·image 的 get_rect()方法,可以返回pygame.Rect(0, 0, 图像宽, 图像高)的对象
?下面通过这个类图来进行操作:
?
代码:?
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 = self.image.get_rect()
self.speed = speed
def update(self):
# 在屏幕的垂直方向上移动
self.rect.y += self.speed
5.3? ?使用游戏精灵 和精灵组创建敌机
需求
·使用刚刚派生的 游戏精灵和精灵组 创建敌机,并且实现敌机动画
步骤
1.使用 from 导入 plane_sprites模块
·from 导入的模块可以直接使用
·import 导入的模块需要通过 模块名. 来使用
2.在游戏初始化创建精灵对象和精灵组对象
3.在游戏循环中 让精灵组 分别调用 update() 和 draw(screen)方法
职责
精灵:
·封装 图像image、位置rect 和速度speed
·提供 update()方法,根据游戏需求,更新位置rect
精灵组:
·包含多个精灵对象
·update方法,让精灵组中所有的精灵调用update方法更新位置
·draw(screen)方法,在screen上绘制精灵组中所有的精灵
操作:
把之前监听事件的代码复制过来:
在箭头这里添加代码,导入精灵组?
接下来在游戏循环上方,准备写入代码
?
创建敌机的精灵和精灵组
但是要想屏幕出现敌机的动画,需要在游戏循环中,用精灵组调用draw 方法
?代码:
import pygame
from plane_sprites import *
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
# 1.加载图像数据
background = pygame.image.load("./images/background.png")
# 2.blit方法 绘制图像
screen.blit(background, (0, 0))
# 绘制英雄飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (200, 500))
# 可以在所有的绘制工作完成之后,同意调用update方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1.定义一个Rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 创建敌机的精灵
enemy = GameSprite("./images/enemy1.png")
# 创建敌机的精灵组
enemy_group = pygame.sprite.Group(enemy)
# 游戏循环 -> 意味着游戏正式开始
while True:
# 可以指定循环体内部的代码执行的频率
clock.tick(60)
# 监听事件
for event in pygame.event.get():
# 判断事件类型是否是退出事件
if event.type == pygame.QUIT:
print("退出游戏")
# quit 卸载所有的模块
pygame.quit()
# exit() 直接终止当前正在执行的程序
exit()
# 2.修改飞机的位置
hero_rect.y -= 1
# 判断飞机的位置,y<=0 飞机出现在屏幕下方
if hero_rect.y <= 0:
hero_rect.y = 700
# 3.调用blit方法绘制图像
screen.blit(background, (0, 0))
screen.blit(hero, hero_rect)
# 让精灵组调用两个方法
# update方法
enemy_group.update()
# draw 方法
enemy_group.draw(screen)
# 4.调用update方法更新显示
pygame.display.update()
pygame.quit()
输出结果:
?
扩展:
精灵组里面是可以包含多个精灵的,所以就可以多设置一些敌机
?注(后面的2 是敌机移动的速度)
输出结果:
总结
关于飞机大战,需要期提前储备的知识点,前期大概就是这些了。
后续就会开始更新飞机大战一步一步的制作,因为是新手,所以更新的比较多,也是为了自己能够方便理解每一步。后面更新的时候,内容中间还会插入一些及时的小知识
|