从 0 到可运行、可打包、可扩展的「一条龙」清单
复制即运行,按需做加法。


1️⃣ 一次性准备

# 建议 Python 3.9+ & Pygame 2.5+
python -m pip install pygame -U

推荐目录结构

mygame/
├─ main.py          # 唯一入口
├─ settings.py      # 全局常量
├─ sprites/         # 角色类
├─ assets/          # 图片、声音、字体
└─ utils/           # 工具函数

2️⃣ 最小可运行模板

保存为 main.pyassets/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.pypyinstaller -F -w

5️⃣ 可继续加料的模块

  • 地图编辑器 → Tiled + pytmx
  • 粒子特效 → numpy + pygame.mask
  • 手柄震动 → pygame._sdl2.controller
  • 物理引擎 → pymunk
  • 网络对战 → asyncio + grpc
  • 自动更新 → requests 下载覆盖 assets

6️⃣ 一句话总结

先让游戏能跑,再让游戏好玩,最后让游戏好卖。
模板跑通 = 完成 0→1,剩下的就是不断往 Group 里加精灵、加状态、加特效!