每个游戏的核心控制流程都是循环,称为游戏循环。游戏循环不断地反复运行,完成使游戏正常运行所需的工作。每迭代一次游戏循环称为一帧。
Pygame框架游戏循环中发生的事情可以分为三种不同的类别。
①事件:需要游戏做出响应的所有内容。例如,在键盘上按下的键,在鼠标上点击的键等。
②更新游戏:此框架上需要更改的所有内容。例如,如果角色悬空,那么需要使用重力将其拉下来;如果两个对象相遇,那么需要发生爆炸。
③渲染:将所有内容绘制在屏幕上。例如,播放器需要查看的背景、角色、菜单或其他任何内容,都必须在屏幕上正确的位置绘制。
游戏循环的关键是控制整个游戏循环的运行速度,即FPS,它表示每秒的帧数,这意味着游戏循环每秒应该发生多少次。如果控制不好FPS,游戏就会运行得过快或过慢。
(1)创建Pygame模版
编写一个简单的Pygame程序,该程序除了打开游戏窗口并运行游戏循环外什么也不做。
首先导入所需的Pygame库,并设置游戏的全局选项变量:
- import pygame
- WIDTH = 300 # 游戏窗口的宽度
- HEIGHT = 420 # 游戏窗口的高度
- FPS = 30 # 每秒的帧数
接下来创建游戏窗口:
- # 初始化Pygame并创建游戏窗口
- pygame.init()
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- pygame.display.set_caption('Demo Game') # 设置游戏标题
- clock = pygame.time.Clock()
先调用pygame.init()启动Pygame并将其初始化;再调用pygame.display.set_mode()创建游戏窗口screen,其参数是一个元组,表示该游戏窗口的宽度和高度;最后调用pygame.time.Clock()创建时钟对象clock,以便能够确保游戏按照设定好的FPS运行。
然后开始编写游戏循环:
- # 游戏循环
- running = True
- while running:
- pass
这是游戏循环的框架代码,它是由变量running控制是否执行的while循环,如果希望游戏循环结束,那么只需将running设置为False即可。
(2)渲染部分
目前示例代码中仅仅演示的是用纯色填充屏幕。下面先介绍一下计算机对颜色的处理。
计算机屏幕由像素组成,这些像素的颜色由三个颜色混合生成,这三个颜色就是三基色:红色(R),绿色(G)和蓝色(B)。每个颜色的发光强度决定了该像素的颜色,用0到255之间的一个整数来表示发光强度的大小,因此,RGB三个颜色中的每个都有256种亮度等级。可以通过三者的乘积,获得计算机中可以显示的颜色总数:256*256*256=16777216。
在项目中定义一些颜色:
- BLACK = (0, 0, 0) # 黑色
- WHITE = (255, 255, 255) # 白色
- RED = (255, 0, 0) # 红色
- GREEN = (0, 255, 0) # 绿色
- BLUE = (0, 0, 255) # 蓝色
以上颜色由一个元组定义,元组中的项按照RGB排序,数值为颜色的亮度等级。
给屏幕填充颜色,并使最近绘制的屏幕可见:
- screen.fill(WHITE)
- pygame.display.flip()
(3)事件部分
此时尝试运行程序,则会发现程序存在问题——无法关闭窗口,单击窗口右上角的“关闭”按钮无效。这是因为“单击窗口右上角的‘关闭’按钮”其实是一个事件,需要监听该事件并做出相应处理——退出游戏。
事件可以随时发生。如果游戏在循环的更新或渲染过程中单击其他按钮怎么办?Pygame要做的是保存自上一帧以来发生的所有事件。这样,如果游戏快速将许多按钮混在一起,那么可以使所有按钮都有效。监听的事件是一个列表,可以使用一个for循环来查看它们:
- for event in pygame.event.get():
- # 检查窗口是否关闭
- if event.type == pygame.QUIT:
- running = False
Pygame中有很多可以监听的事件,pygame.QUIT是单击窗口右上角的“关闭”时触发的事件,此时将running设置为False,游戏循环将终止。
(4)控制FPS
使用FPS来控制游戏的运行速度:
- while running:
- clock.tick(FPS)
tick()方法用于告诉Pygame循环所花的时间。变量FPS已经赋值为30,这意味着游戏循环每秒应该发生30次,即每帧持续1⁄30秒。
(5)组装代码
将上述代码组装起来,并在末尾添加pygame.quit()用于终止游戏:
- import pygame
- WIDTH = 300
- HEIGHT = 420
- FPS = 30
- # 定义颜色
- WHITE = (255, 255, 255)
- BLACK = (0, 0, 0)
- RED = (255, 0, 0)
- GREEN = (0, 255, 0)
- BLUE = (0, 0, 255)
- # 初始化pygame并创建游戏窗口
- pygame.init()
- pygame.mixer.init()
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- pygame.display.set_caption('Demo Game')
- clock = pygame.time.Clock()
- # 游戏循环
- running = True
- while running:
- clock.tick(FPS)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- screen.fill(WHITE)
- pygame.display.flip()
- pygame.quit()
将上述代码进行保存,文件名为template.py,本书后文将使用该Pygame模板作为项目的起点。
运行template.py,运行结果如图1所示。
图1 Pygame模板运行结果