首页 > 解决方案 > 如何在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形的身体吗?

提前致谢!

标签: pythonpygamepymunk

解决方案


问题在于,使用速记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缺点是当您查看身体的位置时,它仍将位于形状的“角落”。


推荐阅读