这是「Python Pygame 系列」的第一篇(上)。整个系列只写两篇,目标很明确:学完这两篇,你就能独立写出一个能玩、能交互、有分数、有胜负判定的 2D 小游戏。
本篇解决「从 0 到能画、能动、能控制」:环境安装、第一个窗口、主循环、坐标系、颜色、绘制、帧率、键盘输入、文字与图片。下一篇解决「从能控制到能成游戏」:Surface 与 Rect、事件系统、鼠标、碰撞检测、精灵与精灵组、声音、游戏状态机,最后完整做出一个可玩的打方块小游戏。
不假设你有游戏开发经验,只要求会 Python 基本语法(函数、循环、变量、元组、列表)。所有代码可直接复制运行,关键代码都加了逐行注释,建议对照注释读一遍再动手敲。
一、pygame 是什么
pygame 是基于 SDL(Simple DirectMedia Layer)的 Python 2D 游戏库。SDL 是一个 C 语言写的底层多媒体库,负责和操作系统打交道:创建窗口、绘制像素、播放声音、读取键盘鼠标输入。pygame 在 SDL 之上包了一层 Python 接口,让你不碰 C 代码就能做 2D 游戏。
理解这个分层很重要,它解释了很多现象。比如为什么 pygame 的绘制函数对浮点坐标支持不好——因为底层 SDL 的绘制接口就是按整数像素设计的;为什么有些操作必须在 set_mode() 之后才能做——因为它们依赖显示设备初始化后的像素格式。
它的核心特点:
- 纯 2D:不做 3D,所以 API 数量少、概念简单,学习曲线平缓。
- 跨平台:Windows、macOS、Linux 同一份代码基本不用改,SDL 帮你屏蔽了系统差异。
- 生态成熟:官方文档齐全,社区案例多,遇到问题容易搜到答案。
- 纯 Python 接口:调试、版本管理、代码复用都很自然,不需要学新的脚本语言或编辑器操作。
边界也要说清楚:pygame 适合 2D 小游戏、原型验证、教学演示、像素风和休闲类游戏;不适合大型 3D、需要复杂物理引擎的商业项目、高并发网络游戏服务端、对渲染性能要求极高的场景。一句话:它是「用 Python 快速做出能玩的东西」的工具,不是商业引擎。想清楚这一点,后面的学习心态会稳很多。
注意事项:不要拿 pygame 和 Unity、Godot 比功能。它们解决的是不同问题。pygame 的价值在于「轻」和「快」——你可以在一个下午做出一个能玩的原型,而不用先花一周学引擎。
二、安装与验证
这一节把「下载安装」讲透。pygame 的安装本身不复杂,但新手卡住的地方往往不是命令写错,而是装到了错误的 Python 环境、网络下载失败或缺少编译依赖。下面按「准备 → 安装 → 验证 → 排错」的顺序展开,每一步都说明为什么这么做。
2.1 安装前的准备:确认解释器
安装前先确认你用的是哪个 Python。很多「装了却 import 不到」的问题,根源就是机器上有多个 Python(系统自带、官网安装、Anaconda、IDE 内置),而 pip 和 python 指向的不是同一个。
# 查看 Python 版本,建议 3.8 及以上
python –version
# 或
python3 –version
查看 pip 对应的解释器路径
python -m pip –version
关键点:始终用 python -m pip 而不是裸 pip。python -m pip 保证「用当前这个 python 去调用它自己的 pip」,从机制上避免解释器错配。裸 pip 可能指向另一个环境的 pip,装完自然 import 不到。
2.2 推荐方式:虚拟环境 + pip 安装
强烈建议在虚拟环境里安装,避免污染全局环境,也避免不同项目之间的依赖冲突。虚拟环境本质是一个独立的目录,里面有自己的 Python 解释器和 site-packages。
# 1. 创建虚拟环境(目录名一般叫 venv)
python -m venv venv
2. 激活虚拟环境
Windows(cmd)
venv\\Scripts\\activate
Windows(PowerShell)
venv\\Scripts\\Activate.ps1
macOS / Linux
source venv/bin/activate
3. 激活后安装,此时 pip 一定属于这个虚拟环境
python -m pip install –upgrade pip
python -m pip install pygame
激活成功后,终端提示符前面通常会出现 (venv) 字样,这是判断「是否在虚拟环境里」最直观的信号。退出虚拟环境用 deactivate。
如果你不想用虚拟环境,也可以直接全局安装,但请务必用 python -m pip install pygame 的形式,确保装到当前解释器。
2.3 网络慢或下载失败:换镜像源
国内访问 PyPI 官方源有时很慢甚至超时,表现为下载卡住、ReadTimeoutError 或 ConnectionResetError。这时换国内镜像源即可:
# 临时使用清华源
python -m pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple
永久配置(写入用户级 pip 配置,之后默认走镜像)
python -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
常用镜像还有阿里云 https://mirrors.aliyun.com/pypi/simple/、中科大 https://pypi.mirrors.ustc.edu.cn/simple/。如果镜像也失败,先检查代理设置,或临时关闭代理再试。
2.4 关于 wheel 与源码编译
pygame 在主流平台(Windows、macOS、常见 Linux 发行版)都提供预编译的 wheel 包,pip 会优先下载 wheel,安装只需几秒,不需要本地编译。
如果 pip 提示「Building wheel for pygame」并开始编译,说明当前 Python 版本或平台没有匹配的 wheel。这时常见报错是缺少 SDL2 头文件或 C 编译器。处理思路按优先级排列:
- 升级 pip:python -m pip install –upgrade pip,老版本 pip 可能不认识新的 wheel 标签。
- 换 Python 版本:用 wheel 覆盖充分的稳定版本(如 3.10、3.11),避免刚发布的最新版。
- Linux 补依赖:Debian/Ubuntu 可先装 sudo apt install python3-dev libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev 再安装。
- 指定版本:python -m pip install pygame==2.5.2,某些版本对特定 Python 支持更好。
2.5 验证安装:三步确认
装完不要只看 pip 的输出,要真正验证。按下面三步走,能定位到具体是哪一层出了问题。
第一步:确认能导入并打印版本
python -c "import pygame; print(pygame.version.ver)"
能打印出版本号(比如 2.5.2),说明 Python 能正确找到并导入 pygame。这一步失败,说明装错了环境或路径有问题。
第二步:确认各子模块可用
import pygame
pygame.init()
print("display:", pygame.display.get_init())
print("font:", pygame.font.get_init())
print("mixer:", pygame.mixer.get_init())
print("SDL:", pygame.get_sdl_version())
pygame.quit()
这一步能看出显示、字体、声音模块是否初始化成功。如果 mixer 是 None,通常是没有音频设备,不影响画图,但播放声音会失败。
第三步:跑官方示例,验证真实渲染
python -m pygame.examples.aliens
这个命令会启动一个简单的太空射击小游戏。如果窗口正常弹出、能用方向键移动、能按空格射击,说明 pygame 的显示、事件、字体、声音模块都工作正常,安装彻底完成。
2.6 常见问题排查
| ModuleNotFoundError: No module named 'pygame' | 装到了别的 Python 环境 | 用 python -m pip install pygame,确保 pip 和 python 是同一个解释器 |
| pip 版本过低报错 | pip 太老,不认识新的 wheel 格式 | python -m pip install –upgrade pip |
| 下载超时 / ConnectionResetError | 网络访问 PyPI 不稳定 | 换国内镜像源,或检查代理设置 |
| Building wheel 后编译失败 | 没有匹配的 wheel,pip 尝试源码编译 | 升级 pip、换 Python 版本,或补齐 SDL2 开发依赖 |
| Linux 报 display 相关错误 | 没有图形界面环境(比如纯 SSH 服务器) | 在桌面环境运行,或配置虚拟显示(如 Xvfb) |
| PowerShell 提示禁止运行脚本 | 执行策略限制激活脚本 | Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |
高频坑:文件名不要叫 pygame.py。否则 Python 会优先导入你自己的文件,导致循环导入或属性缺失,报一堆莫名其妙的错。同理,项目里也不要出现和标准库同名的文件,比如 random.py、sys.py。
注意事项:判断「装没装上」不要只看 pip 的输出,要看 python -c "import pygame" 能不能跑通。pip 装成功但 import 失败,几乎都是解释器不一致的问题。
三、第一个程序:窗口与主循环
3.1 最小可运行代码
先看一个能跑起来的最小例子,后面所有内容都是在这个骨架上长出来的。代码里加了详细注释,建议对照注释逐行读一遍。
import pygame # 引入 pygame 库,所有绘图、事件、声音功能都在这里
import sys # 引入 sys,只为了最后用 sys.exit() 干净地结束进程
1. 初始化 pygame 的所有子模块(显示、字体、声音、时间等)
必须在调用任何 pygame 功能之前执行,否则会报 "video system not initialized"
pygame.init()
2. 创建窗口,参数是 (宽, 高),单位是像素
返回值 screen 是一个 Surface 对象,代表整块画布,后续所有绘制都画在它上面
screen = pygame.display.set_mode((800, 600))
3. 设置窗口标题栏文字,纯展示用,不影响逻辑
pygame.display.set_caption("我的第一个 Pygame 窗口")
4. 主循环开关:running 为 True 时窗口持续存活,为 False 时退出循环
running = True
while running:
# 4.1 取出这一帧内发生的所有事件(关闭、按键、鼠标等)
# 必须每帧调用,否则事件队列堆积,系统会判定程序无响应
for event in pygame.event.get():
# 用户点了窗口右上角的关闭按钮,就结束循环
if event.type == pygame.QUIT:
running = False
# 4.2 用深灰色填充整块画布,相当于「擦黑板」
# 每帧都要做,否则上一帧的内容会残留,出现拖影
screen.fill((30, 30, 40))
4.3 把后台画好的画布一次性推到屏幕上(双缓冲,避免闪烁)
pygame.display.flip()
5. 退出循环后释放 pygame 占用的资源
pygame.quit()
6. 真正结束 Python 进程(pygame.quit() 只清理 pygame,不会退出程序)
sys.exit()
运行后是一个深色窗口,点关闭按钮能正常退出。这几十行就是 pygame 程序的全部核心结构,后面所有复杂的游戏都是在这个骨架上加东西。
3.2 逐段拆解
pygame.init():初始化所有子模块(显示、字体、声音、时间等)。必须在用任何 pygame 功能前调用。它返回一个元组,表示成功和失败的模块数量,一般不用管返回值。如果某个模块初始化失败(比如没有音频设备),程序不会崩,只是相关功能不可用。
set_mode((800, 600)):创建窗口,参数是宽高元组。返回值是一个 Surface 对象,代表整个屏幕画布。所有绘制操作都画在这个 Surface 上,最后通过 flip() 把画布内容推到屏幕。注意:这个 Surface 不是窗口本身,而是窗口的「画布」,理解这一点对后面理解双缓冲很关键。
主循环:while running,每一轮叫一帧。每帧做三件事:处理事件、更新状态、绘制画面。顺序不能乱,先处理输入再绘制,画面才能反映最新状态。如果先绘制再处理事件,你会看到画面总是慢一帧。
pygame.event.get():取出这一帧内发生的所有事件,返回一个列表。事件包括关闭窗口、按键、鼠标移动、窗口大小变化等。必须每帧都调用,否则事件队列会堆积,系统会认为程序无响应。
screen.fill():用指定颜色填充整个画布,参数是 RGB 三元组,每个分量 0-255。这一步相当于「擦黑板」,每帧都要做,否则上一帧的内容会残留,出现拖影。
pygame.display.flip():把画布内容真正显示到屏幕上。pygame 用的是双缓冲机制:你在后台画,画完一次性推上去,避免闪烁。也可以用 pygame.display.update(),区别是 update() 可以只更新指定区域,性能更好,后面会讲。
pygame.quit() 和 sys.exit():退出前释放 pygame 占用的资源,然后结束 Python 进程。pygame.quit() 只清理 pygame,不会退出程序;sys.exit() 才是真正结束进程。两个都要写。
3.3 为什么必须有事件循环
很多新手会问:我就画个静态图,能不能不写循环?技术上可以,但窗口会立刻卡死。因为操作系统需要程序不断响应事件(比如「窗口被拖动」「用户点了关闭」),如果你不处理,系统会认为程序挂了,窗口变成「未响应」状态。
所以事件循环不只是为了「玩游戏」,它是让窗口保持活着的必要条件。这一点和 tkinter 的 mainloop() 是同一个道理。
注意事项:event.get() 每帧只能调用一次。如果在同一帧里调用两次,第二次会拿到空列表,因为事件已经被第一次取走了。这是新手常见的隐蔽 bug。
四、坐标系与颜色
4.1 坐标系
pygame 的坐标系和数学课上的不一样:
- 原点 (0, 0) 在左上角,不是左下角。
- x 轴向右为正,y 轴向下为正。
- 单位是像素。
所以一个 800×600 的窗口,右下角坐标是 (800, 600)。如果你想让一个 50×50 的方块居中,左上角坐标应该是 (800-50)/2 = 375、(600-50)/2 = 275。
这个「y 轴向下」的设定是图形编程的通用做法,习惯就好。记住一句话:y 越大越靠下。做移动逻辑时,向上移动是 y -= speed,向下移动是 y += speed,别写反了。
还有一个容易忽略的点:坐标是整数像素。pygame 的绘制函数对浮点数支持不好,可能报错或出现锯齿。所以做基于时间的移动时,计算过程可以用浮点,但传给绘制函数前要转成 int。
4.2 颜色
用 RGB 三元组表示颜色,每个分量 0-255:
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
四元组 RGBA 的第四个是透明度(alpha),0 全透明,255 不透明。但注意:只有带 alpha 通道的 Surface 才支持透明,直接往屏幕上画四元组颜色,alpha 会被忽略。
实际项目里更推荐自己定义颜色常量,方便统一管理配色。比如把背景色、主色调、强调色定义成常量放在文件顶部,改配色时只改一处。
注意事项:颜色分量必须是 0-255 的整数。传负数或超过 255 的值,pygame 可能不报错但显示异常,排查起来很费劲。写颜色常量时养成检查的习惯。
4.3 动手画点东西:矩形、圆和线
坐标系和颜色讲完了,最好的巩固方式就是立刻画几个图形。pygame 的绘制函数都挂在 pygame.draw 模块下,第一个参数永远是目标 Surface(这里就是 screen),最后一个参数是颜色,中间是几何参数。
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("画几个基本图形")
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((30, 30, 40))
矩形:(x, y, 宽, 高)
pygame.draw.rect(screen, (255, 0, 0), (50, 50, 120, 80))
空心矩形:最后一个参数是线宽
pygame.draw.rect(screen, (0, 255, 0), (220, 50, 120, 80), 3)
圆:(圆心 x, 圆心 y), 半径
pygame.draw.circle(screen, (0, 128, 255), (400, 300), 60)
直线:(起点), (终点), 线宽
pygame.draw.line(screen, (255, 255, 255), (50, 500), (750, 500), 2)
pygame.display.flip()
pygame.quit()
sys.exit()
几个要点:
- 矩形用 (x, y, 宽, 高) 四元组,x, y 是左上角坐标,不是中心点。
- 圆用圆心坐标加半径,圆心是真正的中心,这点和矩形不同。
- 线宽参数省略时默认是 0,表示实心填充;传大于 0 的整数就是空心描边。
- 所有绘制都发生在 fill() 之后、flip() 之前,顺序错了就看不到图形。
4.4 让图形动起来:帧率与时间
静态图形只是热身,游戏的核心是「动」。最朴素的写法是在主循环里不断修改坐标:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
x, y = 0, 280
speed = 5
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
x += speed
if x > 800:
x = -50
screen.fill((30, 30, 40))
pygame.draw.rect(screen, (255, 200, 0), (int(x), y, 50, 50))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
这里出现了两个新东西:
- pygame.time.Clock():创建一个时钟对象,用来控制帧率。
- clock.tick(60):让主循环每秒最多跑 60 轮,也就是 60 FPS。它还会返回距离上一帧的毫秒数,后面做基于时间的移动时会用到。
为什么一定要限制帧率?因为主循环跑得越快,x += speed 执行得越频繁,方块移动就越快。同一份代码在不同性能的电脑上速度完全不同,这显然不可接受。clock.tick(60) 把节奏固定下来,行为才可预测。
注意事项:clock.tick() 要放在循环末尾。放在开头也能跑,但会让第一帧的计时不准,而且逻辑上「先干活再等下一帧」更符合直觉。
4.5 基于时间的移动(更专业的做法)
固定帧率解决了大部分问题,但如果某一帧卡了一下(比如加载资源),方块就会「跳」一下。更稳妥的做法是让移动距离和真实时间挂钩:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
x, y = 0.0, 280.0
speed = 300 # 每秒移动 300 像素
running = True
while running:
# dt 是距离上一帧的秒数
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
x += speed * dt
if x > 800:
x = -50.0
screen.fill((30, 30, 40))
pygame.draw.rect(screen, (255, 200, 0), (int(x), int(y), 50, 50))
pygame.display.flip()
pygame.quit()
sys.exit()
关键在 speed * dt:speed 的单位从「像素每帧」变成了「像素每秒」,无论帧率怎么波动,方块每秒走过的距离都是 300 像素。这也是为什么前面强调「计算用浮点,绘制前转 int」——x 保持浮点精度,只在传给 draw.rect 时取整。
4.6 键盘输入:让玩家控制方块
有了移动,下一步就是让玩家能控制。处理键盘有两种方式,用途不同:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
x, y = 375, 275
speed = 300
running = True
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 方式一:单次按键事件,适合「按一下触发一次」的操作
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
print("按下了空格")
方式二:查询按键当前状态,适合「按住持续移动」
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed * dt
if keys[pygame.K_RIGHT]:
x += speed * dt
if keys[pygame.K_UP]:
y -= speed * dt
if keys[pygame.K_DOWN]:
y += speed * dt
screen.fill((30, 30, 40))
pygame.draw.rect(screen, (0, 200, 255), (int(x), int(y), 50, 50))
pygame.display.flip()
pygame.quit()
sys.exit()
两种方式的区别很关键:
- KEYDOWN 事件:只在按下的那一瞬间触发一次。适合跳跃、射击、开关菜单这类「一次性动作」。
- pygame.key.get_pressed():返回一个按键状态序列,按住期间每帧都是 True。适合方向移动这类「持续动作」。
新手常犯的错是用 KEYDOWN 做移动,结果按住方向键方块只动一下。记住这个区分,能省掉很多调试时间。
注意事项:get_pressed() 返回的是「当前这一帧」的按键状态,必须在事件处理之后、绘制之前调用,才能反映最新输入。
4.7 文字渲染:把分数显示出来
游戏离不开文字。pygame 渲染文字需要先创建字体对象,再生成 Surface,最后贴到屏幕上:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
用系统字体,字号 36
font = pygame.font.SysFont("simhei", 36)
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
score += 1
screen.fill((30, 30, 40))
渲染文字,得到一张 Surface
text_surface = font.render(f"得分:{score}", True, (255, 255, 255))
把文字 Surface 贴到屏幕的 (20, 20) 位置
screen.blit(text_surface, (20, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
几个细节:
- font.render(文本, 抗锯齿, 颜色) 的第二个参数一般传 True,开启抗锯齿后文字边缘更平滑。
- render() 返回的是一个 Surface,不是直接画到屏幕上,所以要用 blit() 贴上去。
- 中文需要指定支持中文的字体,比如 simhei(黑体)。用默认字体渲染中文会显示成方块。
- 字体对象只创建一次,放在循环外面,每帧重复创建会明显拖慢性能。
4.8 图片加载与缩放
除了画图形,pygame 也能加载图片。基本流程是「加载 → 缩放 → 贴图」:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
加载图片(图片要和脚本放在同一目录)
player_img = pygame.image.load("player.png").convert_alpha()
缩放到 64×64
player_img = pygame.transform.scale(player_img, (64, 64))
x, y = 368, 268
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((30, 30, 40))
screen.blit(player_img, (x, y))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
- convert_alpha() 保留透明通道,适合带透明背景的 PNG;如果是没有透明的 JPG,用 convert() 更快。
- pygame.transform.scale() 直接拉伸,速度快但可能失真;smoothscale() 更平滑但稍慢。
- 图片加载失败会抛异常,建议用 try/except 包一层,给出更友好的提示。
4.9 一个完整的小例子:会动会转的方块
把上面这些串起来,做一个能移动、能计分、有文字的小 demo:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("移动方块小 Demo")
clock = pygame.time.Clock()
font = pygame.font.SysFont("simhei", 32)
x, y = 375.0, 275.0
speed = 300
score = 0
running = True
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
score += 1
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed * dt
if keys[pygame.K_RIGHT]:
x += speed * dt
if keys[pygame.K_UP]:
y -= speed * dt
if keys[pygame.K_DOWN]:
y += speed * dt
限制在窗口内
x = max(0, min(x, 800 – 50))
y = max(0, min(y, 600 – 50))
screen.fill((30, 30, 40))
pygame.draw.rect(screen, (0, 200, 255), (int(x), int(y), 50, 50))
text = font.render(f"得分:{score}", True, (255, 255, 255))
screen.blit(text, (20, 20))
pygame.display.flip()
pygame.quit()
sys.exit()
这个例子虽然简单,但已经包含了游戏开发的几个核心要素:输入、状态更新、边界限制、绘制、文字反馈。把它跑通、改一改参数,你对 pygame 的手感就建立起来了。
注意事项:max(0, min(x, 800 – 50)) 这种写法叫「夹紧」(clamp),是限制坐标范围的常用技巧。自己写的时候注意别把上下界写反,否则方块会直接卡在角落。
五、本篇小结与下一步
5.1 核心骨架
flowchart TD
A[pygame.init] –> B[set_mode 创建窗口]
B –> C[主循环 while running]
C –> D[event.get 处理事件]
D –> E[更新状态]
E –> F[fill 清屏 + 绘制]
F –> G[display.flip 刷新]
G –> C
C –> H[QUIT 事件]
H –> I[pygame.quit 退出]
后面所有复杂的游戏,都是在这个骨架上加东西。记住这个顺序:初始化 → 创建窗口 → 主循环(事件 → 更新 → 绘制 → 刷新)→ 退出。
5.2 你应该掌握
- 能装好 pygame 并跑通官方示例。
- 能独立创建窗口并保持运行。
- 理解主循环、事件处理、清屏、刷新四者的关系。
- 理解 pygame 坐标系(左上角原点、y 向下)和 RGB 颜色表示。
- 知道 pygame.quit() 和 sys.exit() 的区别。
- 能画出矩形、圆、线,并让图形按帧率或时间移动。
- 能用 get_pressed() 做持续移动,用 KEYDOWN 做一次性动作。
- 能渲染文字、加载并缩放图片。
如果上面每一条你都能自己写出来、讲清楚,那入门阶段就过关了。
5.3 下一篇预告
下一篇「实战篇」会直接把你带到「能做出游戏」的程度:Surface 与 Rect 的深入用法、事件系统的完整分类、鼠标输入、碰撞检测、精灵(Sprite)与精灵组、声音播放、游戏状态机(开始 / 进行 / 结束),最后完整实现一个可玩的打方块小游戏——有目标、有分数、有倒计时、有胜负判定、有重新开始。
建议你现在先动手把本篇的代码敲一遍,改改窗口大小、换换背景色,感受一下每一行代码的作用。游戏开发是练出来的,不是看出来的。下一篇见。
网硕互联帮助中心



评论前必须登录!
注册