1

我正在使用 pymunk index_video中的代码创建一个通用函数,该函数创建多个相互比赛的汽车,如果它们到达屏幕的右端,它们将从空间中删除并在屏幕的左端重新生成。

问题是,在示例代码中,汽车的每个部分(底盘、销接头、电机、车轮)都分别添加到 Space 中。我想将整个汽车视为一个单独的物体,我可以通过将整个车身的引用存储在一个列表中来跟踪其坐标,并轻松地将其添加或删除到空间中。

此外,如果车轮离底盘太近,它们会相互碰撞。我认为使用ShapeFilter可以帮助避免此类碰撞,但为此我需要将汽车的所有部分作为一个整体。

请多多包涵。我对这个行话完全陌生。

def car(space):
    pos = Vec2d(100,200)

    wheel_color = 52,219,119
    shovel_color = 219,119,52
    mass = 100
    radius = 25
    moment = pymunk.moment_for_circle(mass, 20, radius)
    wheel1_b = pymunk.Body(mass, moment)
    wheel1_s = pymunk.Circle(wheel1_b, radius)
    wheel1_s.friction = 1.5
    wheel1_s.color = wheel_color
    space.add(wheel1_b, wheel1_s)

    mass = 100
    radius = 25
    moment = pymunk.moment_for_circle(mass, 20, radius)
    wheel2_b = pymunk.Body(mass, moment)
    wheel2_s = pymunk.Circle(wheel2_b, radius)
    wheel2_s.friction = 1.5
    wheel2_s.color = wheel_color
    space.add(wheel2_b, wheel2_s)

    mass = 100
    size = (50,30)
    moment = pymunk.moment_for_box(mass, size)
    chassi_b = pymunk.Body(mass, moment)
    chassi_s = pymunk.Poly.create_box(chassi_b, size)
    space.add(chassi_b, chassi_s)

    vs = [(0,0),(25,45),(0,45)]
    shovel_s = pymunk.Poly(chassi_b, vs, transform = pymunk.Transform(tx=85))
    shovel_s.friction = 0.5
    shovel_s.color = shovel_color
    space.add(shovel_s)

    wheel1_b.position = pos - (55,0)
    wheel2_b.position = pos + (55,0)
    chassi_b.position = pos + (0,-25)

    space.add(
        pymunk.PinJoint(wheel1_b, chassi_b, (0,0), (-25,-15)),
        pymunk.PinJoint(wheel1_b, chassi_b, (0,0), (-25, 15)),
        pymunk.PinJoint(wheel2_b, chassi_b, (0,0), (25,-15)),
        pymunk.PinJoint(wheel2_b, chassi_b, (0,0), (25, 15))
        )

    speed = 4
    space.add(
        pymunk.SimpleMotor(wheel1_b, chassi_b, speed),
        pymunk.SimpleMotor(wheel2_b, chassi_b, speed)
)
4

1 回答 1

1

所以这个问题其实是两个问题。

A. 如何制作一个由多个部分组成的“汽车对象”

对此没有内置支持,您可以自己跟踪它。

一种方法是创建一个包含汽车所有部件的汽车类。像这样的(不完整的代码,你需要填写完整的车)

class Car():
    def __init__(self, pos):
        self.wheel_body = pymunk.Body()
        self.wheel_shape = pymunk.Circle()
        self.chassi_body = pymunk.Body()
        self.chassi_shape = pymunk.Poly()
        self.motor = pymunk.SimpleMotor(wheel_body, chassi_body, 0)

    def add_to_space(self, space)
        space.add(self.wheel_body, self.wheel_shape, self.chassi_body, self.chassi_shape, self.motor)

    def set_speed(self, speed)
        self.motor.rate = speed

    def car_position(self)
        return self.chassi_body.position

B.如何使汽车的零件不相互碰撞

这很简单,就像您已经发现 ShapeFilter 是要走的路一样。对于每个“汽车”,创建一个 ShapeFilter 并在其上设置一个唯一的非零组。然后将该 ShapeFilter 设置为构成汽车的每个形状的过滤器属性。形状是否属于同一个主体无关紧要,任何具有带有组集的 ShapeFilter 的形状都不会与具有相同组集的其他形状发生冲突。

于 2019-03-13T20:10:34.090 回答