本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代码演练 I —— 绘制背景图像
需求
- 加载
background.png
创建背景 - 将 背景 绘制在屏幕的
(0, 0)
位置 - 调用屏幕更新显示背景图像
```
绘制背景图像
1> 加载图像
bg = pygame.image.load("./images/background.png")
2> 绘制在屏幕
screen.blit(bg, (0, 0))
3> 更新显示
pygame.display.update() ```
代码演练 II —— 绘制英雄图像
需求
- 加载
me1.png
创建英雄飞机 - 将 英雄飞机 绘制在屏幕的
(200, 500)
位置 - 调用屏幕更新显示飞机图像
```
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 / 60 秒
移动一下所有图像的位置 - 调用
pygame.display.update()
更新屏幕显示
- 每隔
检测用户交互 —— 按键、鼠标等...
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 ```