十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Pygame Zero从零实现Pong:碰撞检测、Actor管理与游戏状态的完整实战

Pygame Zero从零实现Pong:碰撞检测、Actor管理与游戏状态的完整实战 Pygame Zero从零实现Pong碰撞检测、Actor管理与游戏状态的完整实战【免费下载链接】pgzeroA zero-boilerplate games programming framework for Python 3, based on Pygame.项目地址: https://gitcode.com/gh_mirrors/pg/pgzeroPygame Zero基于 Pygame 的零样板 Python 3 游戏框架用一个经典案例帮你一次性掌握游戏开发的三大核心碰撞检测、Actor 管理与游戏状态机。本文以 Pong乒乓球为例带你完整走读从球拍、小球到 AI 对手的全部实现逻辑新手也能轻松上手。 一、为什么用 Pong 入门游戏开发Pong 规则极简——左右球拍击球、球出界得分、先到 11 分获胜——却完整覆盖了 2D 游戏的三大基本功核心概念在 Pong 中的体现碰撞检测球碰到上下边界反弹、碰到球拍折返Actor 管理球拍、小球作为可绘制、可移动的对象游戏状态发球等待 → 对局进行中 → 比赛结束只需一条命令即可安装 Pygame Zero会自动带上 Pygamepip install pgzero如需阅读完整源码可将仓库克隆到本地git clone https://gitcode.com/gh_mirrors/pg/pgzero图Pong 游戏运行截图——上方显示双方比分中间是球与左右球拍 二、运行 Pong 示例看懂项目结构项目内置了一个可直接运行的完整 Pong 示例源码只有一个文件examples/pong/pong.py。在仓库根目录下执行pgzrun examples/pong/pong.pyPygame Zero 的运行器 src/pgzero/runner.py 会自动为你创建游戏窗口、驱动主循环并注入screen、keyboard、WIDTH、HEIGHT、animate等内置对象——你的游戏脚本里一个 import 都不用写这就是零样板的含义。打开examples/pong/pong.py开头用常量定义了游戏规格WIDTH 800 HEIGHT 600 PADDLE_WIDTH 15 PADDLE_HEIGHT 100 TENNIS_BALL_RADIUS 10 三、Actor 管理球拍与小球的面向对象设计球拍让矩形活起来Pong 的球拍直接继承自 Pygame Zero 的Rect类实现在 src/pgzero/rect.py天然带上了x、y、width、height等几何属性再补上移动与绘制两个方法一个完整的Actor就成型了class Paddle(Rect): def up(self): if self.y - 5 40: self.y - 5 def down(self): if self.y self.height 5 HEIGHT - 40: self.y 5 def draw(self): screen.draw.filled_rect(self, MAIN_COLOR)小技巧up()/down()里的判断条件就是边界约束——保证球拍不会飞出场地。小球位置 速度的最小模型小球用一个更轻量的类表示核心就是位置和每帧的位移量dx、dyclass TennisBall(): def __init__(self, start_pos, dt): self.x, self.y start_pos self.dx self.dy dt # 每帧移动的距离 def move(self): self.x self.dx self.y self.dy def draw(self): screen.draw.filled_circle(self.pos, TENNIS_BALL_RADIUS, MAIN_COLOR)小球就是一个会自己走路的圆——Pygame Zero 中一切屏幕上的对象都可以这样状态 move draw三步建模Actor类只是它的精灵图版本可参考文档 doc/introduction.rst。图用screen.draw.filled_circle绘制圆形的窗口效果 四、游戏状态机三个布尔量撑起整局比赛Game类是全局状态中枢整个对局的流转只靠几个简单字段class Game(): def __init__(self, player): self.active_player player # 谁发球 self.score_left 0 self.score_right 0 self.in_progress False # 是否在对局中 self.computer_acting False # AI 是否正在行动状态流转非常清晰等待发球in_progress False球吸附在发球方球拍上position_ball()每帧同步位置开球按下空格键on_key_down事件将in_progress置为True球开始飞出对局中每帧执行proceed()移动球并做碰撞判定得分/终局球出界调用score_for_left()/score_for_right()重新回到等待发球状态任一方到 11 分draw()中显示 WINS!!!。✅ 这就是最朴素的游戏状态机用少量标志位描述局面用每帧的update()推动流转。 五、碰撞检测collidepoint 与反弹逻辑核心方法proceed()是整个游戏的灵魂分三步处理碰撞def proceed(self): self.tennis_ball.move() # 1. 上下边界反弹垂直速度取反 if self.tennis_ball.y 40: self.tennis_ball.dy -self.tennis_ball.dy if self.tennis_ball.y HEIGHT - 40: self.tennis_ball.dy -self.tennis_ball.dy # 2. 球拍碰撞用 collidepoint 判断球心是否落在拍上 if self.left_paddle.collidepoint(self.tennis_ball.pos): self.tennis_ball.dx -self.tennis_ball.dx if self.right_paddle.collidepoint(self.tennis_ball.pos): self.tennis_ball.dx -self.tennis_ball.dx # 3. 出界判分 if self.tennis_ball.x 0: self.score_for_right() if self.tennis_ball.x WIDTH: self.score_for_left()三种碰撞手段各司其职边界反弹直接比较坐标速度分量取负即可反弹球拍碰撞collidepoint(pos)判断球心坐标是否落入球拍矩形内实现见 src/pgzero/rect.py本质是一次区间判断x pos x w矩形对矩形如果以后用两张精灵图可改用Actor的colliderect()或collidepoint()逻辑完全一致。 六、AI 对手预测落点 animate 平滑移动电脑球拍会预判球的走势并用内置的补间动画函数animate()平滑追球def computer_move(self): # 球朝我方飞来时预测其方向 if self.tennis_ball.dx 0: target_y HEIGHT / 2 else: ... # 根据球的位置与 dy 方向推算目标 y animate( self.left_paddle, ytarget_y, duration.50, on_finishedself.computer_stop_acting )animate()是 Pygame Zero 的动画内置函数源码 src/pgzero/animation.py它会在duration秒内把对象属性插值到目标值。默认的linear线性缓动速度恒定正是球拍匀速跟踪的最佳选择图animate()默认 linear 缓动曲线——速度恒定的匀速运动更妙的是on_finished回调AI 发球前会先随机移动 1 秒computer_move_randomly回调链式触发下一次移动最后一跳调用computer_launch开球——用回调串联行为序列无需定时器。️ 七、举一反三从一个 Pong 到一整套游戏库掌握了Actor 碰撞 状态三板斧项目里的其他示例对你都不再神秘examples/asteroids/小行星躲避含音效与多尺寸精灵examples/snake/snake.py贪吃蛇典型的网格碰撞与状态更新examples/lander/lander.py软着陆物理模拟入门examples/maze/maze.py迷宫路径与终点检测。图官方示例库中的 Asteroids 与 Lander展示同一套 API 的进阶用法 八、核心知识速查表你想实现…使用参考位置游戏窗口与主循环pgzrun运行器src/pgzero/runner.py可绘制可移动对象Actor/Rect子类src/pgzero/actor.py点-矩形碰撞collidepoint()src/pgzero/rect.py矩形-矩形碰撞colliderect()src/pgzero/rect.py属性补间动画animate()src/pgzero/animation.py键盘事件on_key_down/keyboardexamples/pong/pong.py完整状态机示例Game类examples/pong/pong.py 总结Pygame Zero 用pgzrun抹掉了 Pygame 的样板代码让你把精力全部放在游戏本身。通过 Pong 这一个例子你已经学会了用面向对象组织 Actor——球拍、小球各自封装 move 与 draw用collidepoint实现碰撞检测——反弹与判分各就各位用少量标志位构建游戏状态机——发球、进行、终局清晰流转。下一步不妨把球拍换成Actor精灵图、给击球加上sounds音效你的第一个完整游戏就诞生了【免费下载链接】pgzeroA zero-boilerplate games programming framework for Python 3, based on Pygame.项目地址: https://gitcode.com/gh_mirrors/pg/pgzero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表