如何在 pymunk 中制作 L-shaped body?
How to make a L-shaped body in pymunk?
我是 pymunk 的新手,我想制作一个 L-shaped body like this.
我读到可以将两个形状附加到同一个 body 但 the best I got is this.
我使用的代码是这样的:
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-shaped body 吗?
提前致谢!
问题在于,使用 shorthand create_box
方法创建的两个多边形形状的中心位于它们所附加的 body 的位置。所以这两个盒子放在彼此的顶部。
要解决此问题,您需要使用更通用的 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
但是请注意,坐标是相对于它们所依附的 body 而言的,重心是 body 所在的位置。这意味着由此产生的 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
这是最容易理解的方式(至少我是这么认为的),但还有其他两种选择。您可以改为将 translate pymunk.Transform
作为 Poly
构造函数的选项,其缺点是结果不太明显。或者你可以用 center_of_gravity
属性 移动 body 上的重心,缺点是当你看 body 的位置时它仍然会在形状的“角”。
我是 pymunk 的新手,我想制作一个 L-shaped body like this.
我读到可以将两个形状附加到同一个 body 但 the best I got is this.
我使用的代码是这样的:
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-shaped body 吗?
提前致谢!
问题在于,使用 shorthand create_box
方法创建的两个多边形形状的中心位于它们所附加的 body 的位置。所以这两个盒子放在彼此的顶部。
要解决此问题,您需要使用更通用的 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
但是请注意,坐标是相对于它们所依附的 body 而言的,重心是 body 所在的位置。这意味着由此产生的 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
这是最容易理解的方式(至少我是这么认为的),但还有其他两种选择。您可以改为将 translate pymunk.Transform
作为 Poly
构造函数的选项,其缺点是结果不太明显。或者你可以用 center_of_gravity
属性 移动 body 上的重心,缺点是当你看 body 的位置时它仍然会在形状的“角”。