pymunk是一款2D物理引擎,在游戏开发中十分有用。安装过程无坑
pip install pymunk
下面举出官网的一个案例,来简述pymunk的使用流程
import pymunk
space = pymunk.Space()
space.gravity = 0,-981
body = pymunk.Body()
body.position = 50,100
poly = pymunk.Poly.create_box(body)
poly.mass = 10
space.add(body, poly)
print_options = pymunk.SpaceDebugDrawOptions()
space.debug_draw(print_options) # 打印状态
其中,
其状态输出如下
draw_polygon ([Vec2d(55.0, 95.0), Vec2d(55.0, 105.0), Vec2d(45.0, 105.0), Vec2d(45.0, 95.0)], 0.0, SpaceDebugColor(r=44.0, g=62.0, b=80.0, a=255.0), SpaceDebugColor(r=52.0, g=152.0, b=219.0, a=255.0))
逐个拆解,draw_polygon表示后面的元组是一个多边形,Vec2d显然是二维平面中的点,4个点构成一个四边形,即poly所对应的形状。由于刚体位置设置在 ( 50 , 100 ) (50,100) (50,100)处,而create_box默认的边长为 ( 10 , 10 ) (10,10) (10,10),所以其四个角的值分别是 50 ± 5 , 100 ± 5 50\pm5, 100\pm5 50±5,100±5。
接下来,对这个空间进行模拟,其方法非常简单,只需调用step命令即可。
ps = [(50,100)] # 记录刚体位置
for _ in range(100): # 运行100次
space.step(0.02) # 步进
ps.append(body.position)
接下来可以绘制一下多边形历经区域,考虑到pymunk主要应用在游戏设计中,故而通过pygame实现绘图
import pygame as pg
from pygame.draw import circle
pg.init()
screen = pg.display.set_mode((320, 180))
c = pg.time.Clock()
i = 0
while True:
if pg.QUIT in [e.type for e in pg.event.get()]:
pg.quit()
break
screen.fill("purple")
c.tick(60) # 5
i += 1
circle(screen, "blue", ps[i%100], 10)
print(ps[i%100])
pygame.display.update()
由于pygame中,Y轴原点在左上角,所以下图中的重力方向与现实刚好相反。