🎮 Pygame 游戏开发流程
从 0 到可运行、可打包、可扩展的「一条龙」清单
复制即运行,按需做加法。
1️⃣ 一次性准备
# 建议 Python 3.9+ & Pygame 2.5+
python -m pip install pygame -U
推荐目录结构
mygame/
├─ main.py # 唯一入口
├─ settings.py # 全局常量
├─ sprites/ # 角色类
├─ assets/ # 图片、声音、字体
└─ utils/ # 工具函数
2️⃣ 最小可运行模板
保存为 main.py,assets/player.png 放一张 64×64 图片即可跑通。
import sys, pygame as pg
from pygame.math import Vector2 as V2
# ----------- 全局常量 -----------
WIDTH, HEIGHT = 960, 540
FPS = 60
TITLE = "My First Pygame"
# ----------- 工具函数 -----------
def load_img(name, alpha=True):
path = f"assets/{name}"
return pg.image.load(path).convert_alpha() if alpha else pg.image.load(path).convert()
# ----------- 精灵类 -----------
class Player(pg.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = load_img("player.png")
self.rect = self.image.get_rect(center=pos)
self.vel = V2(0, 0)
self.speed = 300
def update(self, dt):
keys = pg.key.get_pressed()
self.vel.x = (keys[pg.K_d] - keys[pg.K_a]) * self.speed
self.vel.y = (keys[pg.K_s] - keys[pg.K_w]) * self.speed
self.rect.center += self.vel * dt
self.rect.clamp_ip(pg.display.get_surface().get_rect()) # 边界
# ----------- 主函数 -----------
def main():
pg.init()
pg.display.set_caption(TITLE)
screen = pg.display.set_mode((WIDTH, HEIGHT))
clock = pg.time.Clock()
all_sprites = pg.sprite.Group(Player((WIDTH//2, HEIGHT//2)))
while True:
dt = clock.tick(FPS) / 1000 # 秒
for event in pg.event.get():
if event.type == pg.QUIT or (event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE):
pg.quit(); sys.exit()
all_sprites.update(dt)
screen.fill("black")
all_sprites.draw(screen)
pg.display.flip()
if __name__ == "__main__":
main()
3️⃣ 标准开发流程 Checklist
| 阶段 | 关键动作 | 小贴士 |
|---|---|---|
| 初始化 | pygame.init() 仅一次 |
设置窗口模式、标题、图标 |
| 资源加载 | 图片convert_alpha 声音Sound 字体Font |
提前加载,避免运行时 IO |
| 主循环 | 事件→更新→碰撞→绘制→帧率 | 用 dt 做帧无关运动 |
| 状态管理 | 菜单/游戏/暂停/结束 | 枚举或状态机,禁止嵌套 while |
| 退出 | 先 pygame.quit() 再 sys.exit() |
防止 IDLE 卡死 |
4️⃣ 常见优化与踩坑
| 问题 | 快速解决 |
|---|---|
| 闪屏 | set_mode(..., vsync=1) 或双缓冲 flip() |
| 帧率不稳 | 所有位移 *= dt |
| 高速穿模 | 使用“线段投射”或 pymunk 物理 |
| 内存泄漏 | 字体/图片循环外缓存,不要每次 render |
| 打包发布 | nuitka --standalone --onefile main.py 或 pyinstaller -F -w |
5️⃣ 可继续加料的模块
- 地图编辑器 → Tiled + pytmx
- 粒子特效 →
numpy+pygame.mask - 手柄震动 →
pygame._sdl2.controller - 物理引擎 →
pymunk - 网络对战 →
asyncio+grpc - 自动更新 →
requests下载覆盖assets
6️⃣ 一句话总结
先让游戏能跑,再让游戏好玩,最后让游戏好卖。
模板跑通 = 完成 0→1,剩下的就是不断往Group里加精灵、加状态、加特效!
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运阳的小窝
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果