pygame2

167 阅读3分钟

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

代码演练 I —— 绘制背景图像

需求

  1. 加载 background.png 创建背景
  2. 背景 绘制在屏幕的 (0, 0) 位置
  3. 调用屏幕更新显示背景图像

# 绘制背景图像
# 1> 加载图像
bg = pygame.image.load("./images/background.png")
​
# 2> 绘制在屏幕
screen.blit(bg, (0, 0))
​
# 3> 更新显示
pygame.display.update()

代码演练 II —— 绘制英雄图像

需求

  1. 加载 me1.png 创建英雄飞机
  2. 英雄飞机 绘制在屏幕的 (200, 500) 位置
  3. 调用屏幕更新显示飞机图像

# 1> 加载图像
hero = pygame.image.load("./images/me1.png")
​
# 2> 绘制在屏幕
screen.blit(hero, (200, 500))
​
# 3> 更新显示
pygame.display.update()

透明图像

  • png 格式的图像是支持 透明
  • 在绘制图像时,透明区域 不会显示任何内容
  • 但是如果下方已经有内容,会 透过 透明区域 显示出来

理解 update() 方法的作用

可以在 screen 对象完成 所有 blit 方法之后,统一调用一次 display.update 方法,同样可以在屏幕上 看到最终的绘制结果

  • 使用 display.set_mode() 创建的 screen 对象 是一个 内存中的屏幕数据对象

    • 可以理解成是 油画画布
  • screen.blit 方法可以在 画布 上绘制很多 图像

    • 例如:英雄敌机子弹...
    • 这些图像 有可能 会彼此 重叠或者覆盖
  • display.update() 会将 画布最终结果 绘制在屏幕上,这样可以 提高屏幕绘制效率增加游戏的流畅度

案例调整


# 绘制背景图像
# 1> 加载图像
bg = pygame.image.load("./images/background.png")
​
# 2> 绘制在屏幕
screen.blit(bg, (0, 0))
​
# 绘制英雄图像
# 1> 加载图像
hero = pygame.image.load("./images/me1.png")
​
# 2> 绘制在屏幕
screen.blit(hero, (200, 500))
​
# 3> 更新显示 - update 方法会把之前所有绘制的结果,一次性更新到屏幕窗口上
pygame.display.update()

03. 理解 游戏循环游戏时钟

现在 英雄飞机 已经被绘制到屏幕上了,怎么能够让飞机移动呢

3.1 游戏中的动画实现原理

  • 电影 的原理类似,游戏中的动画效果,本质上是 快速 的在屏幕上绘制 图像

    • 电影是将多张 静止的电影胶片 连续、快速的播放,产生连贯的视觉效果!
  • 一般在电脑上 每秒绘制 60 次,就能够达到非常 连续 高品质 的动画效果

    • 每次绘制的结果被称为 帧 Frame

3.2 游戏循环

游戏的两个组成部分

游戏循环的开始 就意味着 游戏的正式开始

游戏循环的作用

  1. 保证游戏 不会直接退出

  2. 变化图像位置 —— 动画效果

    • 每隔 1 / 60 秒 移动一下所有图像的位置
    • 调用 pygame.display.update() 更新屏幕显示
  3. 检测用户交互 —— 按键、鼠标等...

3.3 游戏时钟

  • pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度 —— 刷新帧率

  • 要使用 时钟对象 需要两步:

    • 1)在 游戏初始化 创建一个 时钟对象
    • 2)在 游戏循环 中让时钟对象调用 tick(帧率) 方法
  • tick 方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时


# 3. 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0# 游戏循环
while True:
​
    # 设置屏幕刷新帧率
    clock.tick(60)
​
    print(i)
    i += 1