当前位置:   article > 正文

pymunk初步:设置重力

pymunk

文章目录

官方示例

pymunk是一款2D物理引擎,在游戏开发中十分有用。安装过程无坑

pip install pymunk
  • 1

下面举出官网的一个案例,来简述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) # 打印状态
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

其中,

  • space是一个可供拟合的空间,通过指定gravity设置竖直向下的重力。
  • body是一个刚体,通过position指定初始位置在 ( 50 , 100 ) (50,100) (50,100)
  • poly是刚体的形状,通过mass指定这个形状的质量
  • 最后,调用add将body和poly添加到仿真空间中。

其状态输出如下

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))
  • 1

逐个拆解,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)
  • 1
  • 2
  • 3
  • 4

可视化

接下来可以绘制一下多边形历经区域,考虑到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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

由于pygame中,Y轴原点在左上角,所以下图中的重力方向与现实刚好相反。

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/435677
推荐阅读
相关标签
  

闽ICP备14008679号