2017年我第一次接触pygame,当时想做一个简单的射击游戏。刚开始看官方文档很懵,很多概念不理解。后来通过做实际项目、查资料、问社区,慢慢掌握了pygame的核心用法。这篇文章分享我的pygame学习路径和实战经验,帮新手少走弯路。
pygame是什么?为什么选择它学游戏开发?
pygame是Python的一个游戏开发库,基于SDL(Simple DirectMedia Layer)封装。我推荐新手用pygame学游戏开发的原因:
- Python语法简单,学习成本低(我教过完全零基础的朋友,2周就能写出简单游戏)
- 资料丰富,遇到问题容易找到解决方案
- 够用:能做2D游戏、休闲游戏、游戏原型
- 轻量:安装简单,不需要配置复杂的开发环境
我的第一个pygame项目:飞机大战(踩坑实录)
2017年10月,我决定用pygame做一个飞机大战游戏。原计划1个月完成,结果做了2个半月。不是因为游戏复杂,而是因为踩了很多坑。
开发过程中的真实问题:
- 碰撞检测不准确:最初用矩形碰撞,但飞机图片是菱形的,导致视觉上没碰到却判定碰撞——后来学会了用mask精确碰撞
- 子弹太多导致帧率下降:同屏200颗子弹时帧率从60掉到40——用对象池技术优化后恢复正常
- 图像闪烁:最初每帧都加载图片,导致闪烁——用convert()方法预转换后解决
- 代码混乱:所有逻辑写在一个文件里,后来重构分成多个模块(游戏对象、工具函数、场景管理)
pygame核心概念(新手必须掌握的)
1. Surface(表面)
pygame中所有的图像都是Surface对象。屏幕是一个大的Surface,每个游戏对象(玩家、敌人、子弹)也是Surface。理解这点很重要。
2. Rect(矩形)
Rect对象用于存储位置和大小信息,也用于碰撞检测。每个Surface通常配一个Rect。
3. 主循环(Game Loop)
所有游戏都有主循环,pygame也不例外。主循环通常包含3部分:处理输入、更新逻辑、渲染画面。
4. 事件系统(Event)
pygame通过事件系统处理用户输入(键盘、鼠标)和系统事件(退出、窗口变化)。
实战教程:用pygame做一个简单的接水果游戏(完整代码)
这是我设计的新手练习项目,包含了pygame的核心用法,代码量约150行,适合新手学习:
import pygame import random import sys # 初始化pygame pygame.init() # 游戏常量 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 FPS = 60 # 颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) # 创建窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("接水果游戏") clock = pygame.time.Clock() # 玩家类 class Player: def __init__(self): self.width = 80 self.height = 20 self.x = SCREEN_WIDTH // 2 - self.width // 2 self.y = SCREEN_HEIGHT - 40 self.speed = 8 self.rect = pygame.Rect(self.x, self.y, self.width, self.height) def move(self, direction): if direction == "left" and self.rect.left > 0: self.rect.x -= self.speed if direction == "right" and self.rect.right < SCREEN_WIDTH: self.rect.x += self.speed def draw(self, surface): pygame.draw.rect(surface, GREEN, self.rect) # 水果类 class Fruit: def __init__(self): self.size = 20 self.x = random.randint(self.size, SCREEN_WIDTH - self.size) self.y = -self.size self.speed = random.randint(3, 7) self.rect = pygame.Rect(self.x, self.y, self.size, self.size) def update(self): self.rect.y += self.speed return self.rect.y > SCREEN_HEIGHT def draw(self, surface): pygame.draw.circle(surface, RED, self.rect.center, self.size // 2) def is_collided_with(self, other_rect): return self.rect.colliderect(other_rect) # 游戏主函数 def main(): player = Player() fruits = [] score = 0 font = pygame.font.Font(None, 36) running = True fruit_spawn_timer = 0 while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 处理键盘输入 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player.move("left") if keys[pygame.K_RIGHT]: player.move("right") # 生成水果 fruit_spawn_timer += 1 if fruit_spawn_timer > 30: # 每30帧生成一个水果 fruits.append(Fruit()) fruit_spawn_timer = 0 # 更新水果位置 for fruit in fruits[:]: if fruit.update(): fruits.remove(fruit) continue # 检测碰撞 if fruit.is_collided_with(player.rect): fruits.remove(fruit) score += 10 # 渲染 screen.fill(BLACK) player.draw(screen) for fruit in fruits: fruit.draw(screen) # 显示分数 score_text = font.render(f"分数: {score}", True, WHITE) screen.blit(score_text, (10, 10)) pygame.display.flip() clock.tick(FPS) pygame.quit() sys.exit() if __name__ == "__main__": main()
代码要点解析:
- 用类封装玩家和水果,代码更清晰
- colliderect()方法检测碰撞,pygame内置的
- clock.tick(FPS)控制帧率,保证游戏速度一致
- 用列表管理多个水果对象,这是游戏开发的常用技巧
pygame新手常见的5个错误(我全犯过)
1. 忘记调用pygame.init()
症状:运行代码报错,提示某些功能不可用。必须在所有pygame操作前调用pygame.init()。
2. 图像没有convert()
症状:游戏运行正常,但帧率偏低。用image.convert()或image.convert_alpha()转换图像格式,渲染速度提升2-3倍。
3. 在主循环里加载资源
症状:游戏卡顿,特别是加载大图片时。正确做法:在游戏初始化时加载所有资源,主循环里只做渲染。
4. 忘记控制帧率
症状:游戏在不同设备上运行速度不一样(高配电脑上游戏速度飞快)。必须用clock.tick(FPS)锁定帧率。
5. 内存泄漏(对象没有删除)
症状:游戏运行时间越长,帧率越低,最终崩溃。原因:不断创建新对象(子弹、敌人),但没有删除已经无用的对象。解决办法:用列表管理对象,及时移除无用对象。
pygame学习路径(我的建议)
- 第1-3天:安装pygame,跑通官方示例(alien飞船那个)
- 第4-7天:做个打砖块游戏(学习基本绘图、碰撞检测)
- 第8-14天:做个飞机大战(学习面向对象、游戏状态管理)
- 第15-21天:加音效、动画、UI(完善游戏体验)
- 第22-30天:做个原创游戏,上架itch.io或Game Jolt
推荐学习资源(我亲自筛选的)
- pygame官方教程:pygame.org/docs/tut/newbieguide.html
- 《Making Games with Python and Pygame》:免费电子书,讲得很系统
- B站UP主「编程不良人」:pygame实战教程,适合零基础
- 游戏宅基地(bacc8.cn):我会分享更多pygame实战技巧和完整项目源码
结语
pygame是一个很适合新手的游戏开发库:学习成本低、资料丰富、能做完整的2D游戏。虽然性能不如C++/C#,但对于独立游戏开发、游戏原型验证、学习游戏开发原理来说,绝对够用。
我的建议是:先花3-5天跟着官方教程做一个完整的小游戏(打砖块或贪吃蛇),理解pygame的基本用法。然后立刻开始做自己的游戏,遇到问题就查文档、搜Stack Overflow、问社区。游戏开发是实践性很强的技能,不动手永远学不会。 如果你在pygame学习过程中遇到问题,欢迎来游戏宅基地(bacc8.cn)交流,我会持续分享pygame开发的实战经验和完整项目源码。祝大家都能用pygame做出有趣的游戏!