万事俱备只欠东风,让我们行动起来。
在项目中新建一个Python文件,命名为01.py,然后输入以下内容:
01\01.py
|
import pygame
# 初始化pygame pygame.init()
# 设置窗口大小 screen_width = 400 screen_height = 300 screen = pygame.display.set_mode((screen_width, screen_height))
# 设置窗口标题 pygame.display.set_caption('super mario bros')
# 等待输入 input() |
运行程序,画面如图1‑18所示。

图1‑18创建游戏窗口
代码比较简单,看注释文字即可看懂,其中:
l pygame.init()是用来初始化pygame模块的,这个是必须调用的。
l pygame.display.set_mode()方法用来创建窗口,宽度和高度值用括号包起来,以元祖的形式作为参数。
l pygame.display.set_caption()方法用来设置窗口标题。
l 最后的input()方法会等待用户输入,这里是为了暂停程序运行,否则程序直接就结束了,窗口一闪就没了。
点击窗口右上角的关闭按钮,会发现窗口关不掉,没有响应,只能点击编辑器工具栏的停止按钮来强制关闭。我们想办法处理一下,代码如下所示:
01\02.py
|
import pygame
# 初始化pygame pygame.init()
# 设置窗口大小 WIDTH = 400 HEIGHT = 300 screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 设置窗口标题 pygame.display.set_caption('super mario bros')
# 主循环 isRunning = True while isRunning: for event in pygame.event.get(): if event.type == pygame.QUIT: isRunning = False
# 退出 Pygame pygame.quit() |
代码中使用while循环替代了之前的input()方法。Pygame使用事件来处理用户输入、窗口操作等各种交互动作。pygame.event.get()方法会返回一个列表,其中包含当前所有待处理的事件。遍历这个列表,如果发现 pygame.QUIT 类型的事件(即用户关闭窗口的事件),则将isRunning变量设置为 False,while循环会结束,然后调用pygame.quit()方法释放各种资源,程序结束,窗口关闭。
这个while循环通常称为游戏的主循环,整个游戏就是运行在这个主循环中,不停的处理玩家的输入,显示各种画面、怪物和效果,直至玩家退出游戏。这也是游戏开发与普通程序开发的区别,普通程序一般执行完业务处理就会结束。
运行修改后的程序,点击窗口右上角的关闭按钮,窗口可以正常关闭了。让我们庆祝一下吧,我们已经成功开发了一个最简单的游戏。
目前,我们的游戏可以运行,但观察到程序的CPU占用较高。这是由于主循环除了获取事件列表外没有其他操作,导致程序在空转状态下不断占用CPU资源。
为了减缓CPU占用过高的问题,一种常见的处理方法是增加睡眠时间。即在每次循环处理任务后,程序主动休眠一段时间,从而暂时释放CPU资源。
在游戏开发中,主循环每次循环称为一帧,每秒执行的帧数称为帧率。Pygame提供了Clock对象来控制帧率,我们将游戏的帧率设置为60帧每秒,代码如下所示:
01\03.py
|
import pygame
# 初始化pygame pygame.init()
# 设置窗口大小 WIDTH = 400 HEIGHT = 300 screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 设置窗口标题 pygame.display.set_caption('super mario bros')
# 时钟 clock = pygame.time.Clock()
# 主循环 isRunning = True while isRunning: for event in pygame.event.get(): if event.type == pygame.QUIT: isRunning = False
# 每秒60帧 clock.tick(60) # 退出 Pygame pygame.quit() |
代码中调用pygame.time.Clock()方法创建时钟对象,再使用tick(60)将帧率设置为60。如果希望将帧率设置为100,则可以使用tick(100)。运行程序,会发现CPU的占用率从之前的14%降至0%。
通常,我们会将tick()方法置于主循环的最后,其作用类似于睡眠。举例来说,如果帧率为100,即每秒执行100次循环,每次循环需时10毫秒。假设任务处理占用了1毫秒,则tick()方法将会睡眠9毫秒。如果任务处理时间增至2毫秒,则睡眠时间将减少至8毫秒,以此类推。tick()方法确保每次循环的总体运行时间为10毫秒。
值得注意的是,存在一个例外情况:如果任务处理占用了20毫秒,则tick()方法将不会睡眠,因为已经超过了10毫秒。如果每次处理任务都需要20毫秒,则实际帧率将降至50,玩家可能会感受到游戏卡顿。因此,使用tick(100)方法来控制帧率,实际上是设定游戏的最大帧率为100,即便电脑配置再高,帧率也不会超过100。