python - 如何在pymunk中制作L形身材?
问题描述
我是 pymunk 的新手,我想做一个像这样的 L 形身体。
我读到可以将两个形状附加到同一个身体上,但我得到的最好的是这个。
我使用的代码是这样的:
import pymunk
import pygame
import pymunk.pygame_util
pygame.init()
size = 640, 240
screen = pygame.display.set_mode(size)
draw_options = pymunk.pygame_util.DrawOptions(screen)
space = pymunk.Space()
space.gravity = 0, 90
b0 = space.static_body
segment = pymunk.Segment(b0, (0, 200), (640, 200), 4)
segment.elasticity = 1
body = pymunk.Body(mass=1, moment=10)
body.position = 300, 50
box = pymunk.Poly.create_box(body, (100, 50))
box.elasticity = 0.9
box.friction = 0.8
box2 = pymunk.Poly.create_box(body, (50, 100))
space.add(body, box, box2, segment)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(color="GRAY")
space.debug_draw(draw_options)
pygame.display.update()
space.step(0.01)
pygame.quit()
有什么办法可以做一个L形的身体吗?
提前致谢!
解决方案
问题在于,使用速记create_box
方法创建的两个 Poly 形状都是以它们的中心在它们所连接的实体的位置创建的。所以这两个盒子被放置在彼此的顶部。
要解决此问题,您需要使用更通用的Poly
构造函数。通过这种方式,您可以根据需要选择位置。
如果我只是拍下你的照片并将坐标乘以 10,它会是这样的:
box = pymunk.Poly(body, [(0, 0), (60, 0), (60, 30), (0, 30)])
box.elasticity = 0.9
box.friction = 0.8
box2 = pymunk.Poly(body, [(0, 30), (30, 30), (30, 60), (0, 60)])
box2.elasticity = 0.9
box2.friction = 0.8
但是,请注意,坐标是相对于它们所附着的物体的,而重心是物体所在的位置。这意味着生成的 L 形将表现为一个空心形状,一个角落有一块超重的石头。
如果这不是您想要的,可以调整坐标,例如像这样(我只是从每个中减去 30。这可能会根据您的目标进行更多调整):
box = pymunk.Poly(body, [(-30, -30), (30, -30), (30, 0), (-30, 0)])
box.elasticity = 0.9
box.friction = 0.8
box2 = pymunk.Poly(body, [(-30, 0), (0, 0), (0, 30), (-30, 30)])
box2.elasticity = 0.9
box2.friction = 0.8
这是最容易理解的方式(至少我是这么认为的),但还有其他两种选择。相反,您可以将翻译pymunk.Transform
作为Poly
构造函数的选项提供,但缺点是结果不太明显。或者您可以使用属性移动身体的重心,center_of_gravity
缺点是当您查看身体的位置时,它仍将位于形状的“角落”。
推荐阅读
- java - Jenkins - Selenium Maven 测试错误 - 未能执行目标
- prolog - 为什么这两个序言代码会返回不同的结果?
- python - 无法使用 anaconda 安装 Python 3.x
- python-3.x - 获取 kerberos 令牌的延迟:python gssapi securitycontext
- python - 具有递归或时间戳错误的最佳假期搜索
- c# - ManualResetEventSlim.Wait() - TimeSpan 与 int 中的超时
- javascript - 在 JS 中使用 IIFE 通过创建私有变量来保护数据
- automata - 图灵机计算器
- javascript - 对象内对象的交叉比较
- git - 使用无法从开发工作站访问的 Git 存储库