pygame3

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

3.4 英雄的简单动画实现

需求

  1. 游戏初始化 定义一个 pygame.Rect 的变量记录英雄的初始位置
  2. 游戏循环 中每次让 英雄y - 1 —— 向上移动
  3. y <= 0 将英雄移动到屏幕的底部

提示:

  • 每一次调用 update() 方法之前,需要把 所有的游戏图像都重新绘制一遍
  • 而且应该 最先 重新绘制 背景图像

```

4. 定义英雄的初始位置

herorect = pygame.Rect(150, 500, 102, 126) ​ while True: ​    # 可以指定循环体内部的代码执行的频率    clock.tick(60) ​    # 更新英雄位置    herorect.y -= 1 ​    # 如果移出屏幕,则将英雄的顶部移动到屏幕底部    if herorect.y <= 0:        herorect.y = 700 ​    # 绘制背景图片    screen.blit(bg, (0, 0))    # 绘制英雄图像    screen.blit(hero, hero_rect) ​    # 更新显示    pygame.display.update() ```

作业
  1. 英雄向上飞行,当 英雄完全从上方飞出屏幕后
  2. 将飞机移动到屏幕的底部

```

if herorect.y + herorect.height <= 0:    hero_rect.y = 700 ```

提示

  • Rect 的属性 bottom = y + height

```

if herorect.bottom <= 0:    herorect.y = 700 ```

3.5 在游戏循环中 监听 事件

事件 event
  • 就是游戏启动后,用户针对游戏所做的操作
  • 例如:点击关闭按钮点击鼠标按下键盘...
监听
  • 游戏循环 中,判断用户 具体的操作

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

代码实现
  • 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() ```

04. 理解 精灵精灵组

4.1 精灵 和 精灵组

  • 在刚刚完成的案例中,图像加载位置变化绘制图像 都需要程序员编写代码分别处理

  • 为了简化开发步骤,pygame 提供了两个类

    • pygame.sprite.Sprite —— 存储 图像数据 image位置 rect对象
    • pygame.sprite.Group

精灵
  • 在游戏开发中,通常把 显示图像的对象 叫做精灵 Sprite

  • 精灵 需要 有 两个重要的属性

    • image 要显示的图像
    • rect 图像要显示在屏幕的位置
  • 默认的 update() 方法什么事情也没做

    • 子类可以重写此方法,在每次刷新屏幕时,更新精灵位置
  • 注意pygame.sprite.Sprite 并没有提供 imagerect 两个属性

    • 需要程序员从 pygame.sprite.Sprite 派生子类
    • 并在 子类初始化方法 中,设置 imagerect 属性
精灵组
  • 一个 精灵组 可以包含多个 精灵 对象

  • 调用 精灵组 对象的 update() 方法

    • 可以 自动 调用 组内每一个精灵update() 方法
  • 调用 精灵组 对象的 draw(屏幕对象) 方法

    • 可以将 组内每一个精灵image 绘制在 rect 位置

```

Group(*sprites) -> Group ```

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

4.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

提示

  • imageget_rect() 方法,可以返回 pygame.Rect(0, 0, 图像宽, 图像高) 的对象

```

import pygame ​ ​ class GameSprite(pygame.sprite.Sprite):    """游戏精灵基类"""        def init(self, imagename, speed=1):                # 调用父类的初始化方法        super().init()                # 加载图像        self.image = pygame.image.load(imagename)        # 设置尺寸        self.rect = self.image.get_rect()        # 记录速度        self.speed = speed ​    def update(self, *args):                # 默认在垂直方向移动        self.rect.y += self.speed         ```

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

需求

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

步骤

  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 * ```

  • 2) 修改初始化部分代码

```

创建敌机精灵和精灵组

enemy1 = GameSprite("./images/enemy1.png") enemy2 = GameSprite("./images/enemy1.png", 2) enemy2.rect.x = 200 enemy_group = pygame.sprite.Group(enemy1, enemy2) ```

  • 3) 修改游戏循环部分代码

```

让敌机组调用 update 和 draw 方法

enemygroup.update() enemygroup.draw(screen) ​

更新屏幕显示

pygame.display.update() ```

\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值