栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pygame中的监听事件以及精灵和精灵组

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pygame中的监听事件以及精灵和精灵组

pygame监听事件以及精灵和精灵组

文章目录
  • pygame监听事件以及精灵和精灵组
  • 1.游戏循环中监听事件
    • 1.事件(event)
    • 2.监听
    • 3.代码实现
  • 二.理解精灵和精灵组
    • 1.精灵
    • 2.精灵组
  • 三、派生精灵子类
  • 四. 使用 游戏精灵 和 精灵组 创建敌机
  • 五.小结


1.游戏循环中监听事件 1.事件(event)

1.1:就是游戏启动后,用户针对游戏所做的操作

1.2:例如:点击关闭按钮,点击鼠标,按下键盘…

2.监听

2.1:在游戏循环中,判断用户具体的操作。

只有捕获到用户具体的操作,才能有针对性的做出响应。

3.代码实现

pygame 中通过 pygame.event.get() 可以获得 用户当前所做动作 的 事件列表

  • 用户可以同一时间做很多事情

提示:这段代码非常的固定,几乎所有的 pygame 游戏都 大同小异!

  # 游戏循环
    while True:
    
        # 设置屏幕刷新帧率
        clock.tick(60)
    
        # 事件监听
        for event in pygame.event.get():
    
            # 判断用户是否点击了关闭按钮
            if event.type == pygame.QUIT:
                print("退出游戏...")
    
                pygame.quit()
    
                # 直接退出系统
                exit()

二.理解精灵和精灵组
  • 在刚刚完成的案例中,图像加载、位置变化、绘制图像 都需要程序员编写代码分别处理
  • 为了简化开发步骤,pygame 提供了两个类
    • pygame.sprite.Sprite —— 存储 图像数据 image 和 位置 rect 的 对象
    • pygame.sprite.Group
1.精灵
  • 在游戏开发中,通常把 显示图像的对象 叫做精灵 Sprite
  • 精灵 需要 有 两个重要的属性
    • image 要显示的图像
    • rect 图像要显示在屏幕的位置
  • 默认的 update() 方法什么事情也没做
    • 子类可以重写此方法,在每次刷新屏幕时,更新精灵位置
  • 注意:pygame.sprite.Sprite 并没有提供 image 和 rect 两个属性
    • 需要程序员从 pygame.sprite.Sprite 派生子类
    • 并在 子类 的 初始化方法 中,设置 image 和 rect 属性
2.精灵组
  • 一个 精灵组 可以包含多个 精灵 对象
  • 调用 精灵组 对象的 update() 方法
    • 可以 自动 调用 组内每一个精灵 的 update() 方法
  • 调用 精灵组 对象的 draw(屏幕对象) 方法
    • 可以将 组内每一个精灵 的 image 绘制在 rect 位置
Group(*sprites) -> Group

注意:仍然需要调用 pygame.display.update() 才能在屏幕看到最终结果

三、派生精灵子类
  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, 图像宽, 图像高) 的对象
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, *args):
        
        # 默认在垂直方向移动
        self.rect.y += self.speed

四. 使用 游戏精灵 和 精灵组 创建敌机

需求

  • 使用刚刚派生的 游戏精灵 和 精灵组 创建 敌机 并且实现敌机动画

步骤

  1. 使用 from 导入 plane_sprites 模块
    • from 导入的模块可以 直接使用
    • import 导入的模块需要通过 模块名. 来使用
  2. 在 游戏初始化 创建 精灵对象 和 精灵组对象
  3. 在 游戏循环中 让 精灵组 分别调用 update() 和 draw(screen) 方法

职责

  • 精灵
    • 封装 图像 image、位置 rect 和 速度 speed
    • 提供 update() 方法,根据游戏需求,更新位置 rect
  • 精灵组
    • 包含 多个 精灵对象
    • update 方法,让精灵组中的所有精灵调用 update 方法更新位置
    • draw(screen) 方法,在 screen 上绘制精灵组中的所有精灵

实现步骤

    1. 导入 plane_sprites 模块
  from plane_sprites import *
    1. 修改初始化部分代码
   # 创建敌机精灵和精灵组
    enemy1 = GameSprite("./images/enemy1.png")
    enemy2 = GameSprite("./images/enemy1.png", 2)
    enemy2.rect.x = 200
    enemy_group = pygame.sprite.Group(enemy1, enemy2)
    1. 修改游戏循环部分代码
   # 让敌机组调用 update 和 draw 方法
    enemy_group.update()
    enemy_group.draw(screen)
    
    # 更新屏幕显示
    pygame.display.update()

五.小结

本章概述了pygame中监听事件以及精灵和精灵组,接下来就是实现飞机大战游戏了,需要的基础知识到此差不多就结束了,只要这几章内容能理解,并且懂得面向对象编程,那么接下来的游戏实现其实是非常简单的。

有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号