
一、开篇每个游戏大牛都从“画方块”开始大家好我是你们的游戏开发引路人K 兄。很多新手一上来就想复刻《黑神话悟空》结果被引擎、Shader、骨骼动画直接劝退。其实所有 3A 大作的底层都离不开一个最朴素的逻辑在一个死循环里擦掉旧画面画上新画面。今天我们就用 Pygame 这个最经典的 2D 库来玩转这个“死循环”。我们不追求华丽的贴图只用一个红色背景、一个绿色方块、一个蓝色长条把它们变成一场永不停歇的“跑酷秀”。二、核心骨架游戏引擎的“三板斧”一切游戏的核心都浓缩在这个while True里。我们来拆解一下这份基础代码的“机械结构”import pygame import sys pygame.init() screen pygame.display.set_mode((800, 600)) # 创建画布 surface pygame.Surface((200, 20)) # 蓝色小条 surface.fill((0, 0, 255)) rect_y 0 x_pos 0 while True: # 1. 事件处理监听退出 for event in pygame.event.get(): if event.type pygame.QUIT: pygame.quit() sys.exit() # 2. 更新逻辑移动坐标 rect_y 1 if rect_y 600: rect_y -50 x_pos 0.1 if x_pos 800: x_pos -200 # 3. 绘制与翻转双缓冲技术 screen.fill((255, 0, 0)) # 清屏擦黑板 screen.fill((0, 255, 0), (100, rect_y, 100, 50)) # 画绿块 screen.blit(surface, (x_pos, 200)) # 贴蓝条 pygame.display.flip() # 翻页呈现画面双缓冲Flip小知识你在屏幕上看到的不是直接绘制的图像而是先在内存中画好再一次性“翻”到屏幕上。这样避免了画面撕裂。三、进阶扩展①给游戏装上“物理挂钟”——FPS 锁定如果你运行上面的代码会发现方块移动速度忽快忽慢。这是因为循环速度取决于 CPU 性能。在游戏开发中我们必须用pygame.time.Clock()来锁定帧率。clock pygame.time.Clock() while True: clock.tick(60) # 强行把帧率锁死在 60 FPS # ... 其余代码不变原理揭秘tick(60)会计算本次循环耗时如果耗时不足1/60秒就调用time.sleep()补足剩余时间。这样你的游戏在 10 年前的电脑和最新款 Mac 上速度完全一致。四、进阶扩展②高阶物理入门——Delta Time增量时间锁定 60 FPS 虽然好但如果某次绘制卡了一下导致这一帧耗时 0.05 秒正常是 0.016 秒我们的方块移动距离就会缩水。商业游戏的做法是引入“时间增量”。clock pygame.time.Clock() while True: delta clock.tick(60) / 1000.0 # 换算成秒单位毫秒 - 秒 # 每秒移动 300 像素无论帧率如何波动实际路程恒等 rect_y 300 * delta x_pos 200 * delta这才是《原神》《王者荣耀》等跨设备游戏保证手感一致的底层秘诀。五、进阶扩展③别“瞬移”了来点“弹性碰撞”吧原代码里绿块落到最底下就突然飞到顶部像极了恐怖片瞬移。我们改成物理反弹视觉效果瞬间丝滑speed_y 3 while True: rect_y speed_y # 碰到上下边界就反向 if rect_y 550 or rect_y 0: speed_y -speed_y现在绿块就像在红色墙壁之间快乐地弹弹乐甚至可以加上重力模拟每次循环speed_y 0.1瞬间变成物理沙盒六、进阶扩展④给 Surface 加上“透明玻璃”特效原代码的蓝色小条是实心的如果想做半透明光晕或残影只需在创建Surface时开启SRCALPHA通道# 开启 Alpha 通道支持透明度 surface pygame.Surface((200, 20), pygame.SRCALPHA) surface.fill((0, 0, 255, 128)) # 128 表示半透明把它blit到红色背景上会呈现蓝色玻璃质感瞬间提升项目的高级感。 写在最后面试考点为什么不用pygame.display.update()而用flip()update()可以只更新指定区域性能好flip()更新整个窗口。新手用flip()更稳妥。event.get()会清空事件队列吗会所以千万别在多个地方调用它否则事件会丢失。思考题如果我把clock.tick(60)放到while循环的末尾会发生什么微妙的变化提示第一帧的移动距离会异常