上节课的代码不知道大家有没有完全理解、完全吃透,因为关于游戏开发,有些理论基础大家要知道,要掌握。所以这一节课我们以问答的形式对上节课大家可能存在的疑惑进行一个总结。
上节课的例子中,我们说创建两个 Surface 对象,又说将其中一个 Surface 对象移动到另外一个 Surface 对象上,还说 Surface 对象有 fill() 方法和 blit() 方法。说起来很难理解似的,那什么是 Surface 对象呢?
Surface 对象就是 Pygame 里面用来表示图像的对象。以后我们说图像,其实就是 Surface 对象,说Surface 对象,也就是图像。
比方说,我们上一节课演示了代码,我们来一个截图:
这只小猪就是 surface 对象的 blit()方法将其移动到画布的背景上面的,这里有两个surface对象嘛,一个是小猪,一个是背景画布。那我现在问大家,眼前的是一个图像还是两个图像呢?
没错,答案是一个图像。事实上,在Pygame里面,每一刻呈现出来的也是一个图像,我们知道,图像是由像素组成的,比方说,我们的这只小猪,我们将其放大,就会看到很多小方块,就是像素。
我们使用 blit() 方法将一个图像放到另一个图像上,其实说并不是将一个图像真的拷贝到另一个图像上,Pygame 只是修改另一个图像某一部分的像素的颜色。例如,将小猪移动到白色画布上,Pygame只是将画布上小猪这一部分位置的像素的颜色改成小猪这个surface对象对应的像素的颜色,从而达到覆盖的效果。
我们已经知道将一个图像拷贝到两一个图像上事实上是修改某一个图像的某些位置的像素的颜色。移动图像又是怎么实现的呢。这就涉及到帧率的问题。
在游戏开发和视频制作中,我们常常会听到 帧 这个关键词。帧通常就是指我们的一幅图像。帧率就是一秒钟能够切换多少幅这样的图像。Pygame 是支持40至200帧的速度。也就说,Pygame支持每秒切换40-200幅图像。那么小猪是怎样移动的呢?我们来看一下代码:
speed = [-2, 1]
# 获得图像的位置矩形
position = turtle.get_rect()
# 移动图像
position = position.move(speed)
移动图像就是调用 move()方法,事实上就是修改矩形范围的位置。x轴减2,y轴加1。
移动之后,我们使用 fill()方法将画布背景填充为白色,我们再使用blit()方法将移动后的小猪贴到画布上,最后更新、延迟。
在上节课中,由于怕我们的小猪乱窜,我们采用了 time模块的 delay() 方法进行延迟。我们刚才已经提到的帧率,其实我们的 Pygame 是可以直接来设置帧率的,time 模块有一个 Clock 类,我们在前面实例化一个 Clock对象,赋值给变量 clock。Clock 对象有一个方法叫做 tick(),参数就是设置的帧率,比如我们这里设置为200。(得到的小猪的帧率就是不高于 200帧,大家可以运行一下)
import pygame
import sys
# 初始化Pygame
pygame.init()
size = width, height = 800, 600
speed = [-2, 1]
bg = (255, 255, 255) # RGB
#实例化Pygame 的time 模块的 Clock 对象
clock = pygame.time.Clock()
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")
# 加在图片
turtle = pygame.image.load("python.png")
# 获得图像的位置矩形
position = turtle.get_rect()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 移动图像
position = position.move(speed)
if position.left < 0 or position.right > width:
# 翻转图像
turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
# 反方向移动
speed[0] = -speed[0]
if position.top < 0 or position.bottom > height:
speed[1] = -speed[1]
# 填充背景
screen.fill(bg)
# 更新图像
screen.blit(turtle, position)
# 更新界面
pygame.display.flip()
# 延迟10毫秒
#pygame.time.delay(10)
#设置帧率
clock.tick(200)
通常我们就是使用这样的方法来控制游戏的速度,因为用户的显卡不一样,有的人跑得快,有的人跑得慢,你可以把速度控制在一定的水平下。
有的人很关心这个问题,因为我们知道 Python 虽然简洁好用,非常方便,但是它的效率不高,而游戏开发对于性能是有着苛刻的追求的,比如说在复杂的绘制环境中,我们要保持一个比较高的帧率,游戏才能体现出流畅的感觉。Pygame里面的大部分模块考虑到效率的原因,都是由C语言来编写并优化的,因此,效率方面肯定不在话下。因为现在大部分的游戏引擎都是用 C 语言来写的,考虑的就是效率,官方数据显示,刚才我们也提到了,它的帧率是保持在40-200帧/秒,对于人眼,每秒30帧被认为是可以接受的流畅度。
官网:https://www.pygame.org
我们不得不说,Pygame的官网是有详细的文档的:
但是有很多时候,我们是上不去这个网站的,该怎么办呢?
别担心,我接下来会创建一个新的专栏,提供 Pygame 的文档详解。(前面的 Tkinter 就是这样学习的:一边看课程,一边看文档)。