游戏介绍
最近比较忙,周末正好有时间写了python版本的愤怒的小鸟,使用了物理引擎pymunk,图片资源是从github上下载的,实现了一个可玩的简单版本。
功能实现如下:
- 支持小鸟类型:红色小鸟,蓝色小鸟,黄色小鸟。
- 支持障碍物的类型:玻璃,木头,石头。
- 支持障碍物的形状:各种长度的长方形,正方形和圆形。
- 使用json文件保存关卡信息,设置小猪和障碍物的位置。
游戏截图如下:
图2
图3
完整代码
游戏实现代码的github链接 愤怒的小鸟
Pymunk介绍
pymunk是一个2D的物理引擎, 它实际是封装了 c语言写的2D物理引擎Chipmunk,可以实现碰撞,旋转等物理运动。
安装pymunk,可以直接使用pip工具,安装最新的pymunk 5.5.0:
1 pip install pymunk
介绍下在pymunk中会使用到的四个基本的类:
- 刚体 (pymunk.Body):一个刚体具有物体的物理属性(质量、坐标、旋转角度、速度等),它自己是没有形状的。
- 碰撞形状 (pymunk.Circle, pymunk.Segment and pymunk.Poly):通过将形状附加到实体,你可以定义一个实体的形状。你可以将多个形状附加到单个实体上来定义一个复杂的形状,如果不需要形状,则可以不附加任何形状。
- 约束/关节 (pymunk.constraint.PinJoint, pymunk.constraint.SimpleMotor):你可以在两个实体之间附加关节以约束它们的行为。比如在两个实体间保持一个固定的距离。
- 空间 (pymunk.Space): 空间是pymunk中基本的模拟单元。你可以添加实体,形状和关节到空间,然后整体更新空间。pymunk会控制空间中所有的实体,形状和关节如何相互作用。
代码实现
将物理引擎相关的代码单独放在了一个文件 (source\component\physics.py)中,减少代码的耦合。
定义了一个Physics类,向外提供所有物理引擎相关的函数。
这篇文章只介绍physics.py 中pymunk相关的代码。
pymunk相关初始化
reset 函数初始化了 空间类(pm.Space), 设置了两个参数
- gravity : 重力
- dt (Time step length) : 表示pymunk中每次更新的时间段值,比如dt值是0.002,表示时间段是0.002秒。
setup_lines函数设置了一条直线,作为地面。
Segment类创建了一条从点a 到 点b的直线。
1 class pymunk.Segment(body, a, b, radius) 2 Bases: pymunk.shapes.Shape 3 A line segment shape between two point. Meant