分组(没有碰撞),添加和删除pymunk中的多个实体和多边形?

时间:2019-03-13 16:35:22

标签: pymunk

我正在使用来自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)
)

1 个答案:

答案 0 :(得分: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设置为组成汽车的每个形状的filter属性。形状是否属于同一物体都没有关系,具有ShapeFilter且具有组集的任何形状都不会与具有相同组集的其他形状发生碰撞。