Группировка (без столкновений), добавление и удаление нескольких тел и полигонов в пимунке? - PullRequest
1 голос
/ 13 марта 2019

Я использую код из pymunk index_video , чтобы создать универсальную функцию, которая создает несколько автомобилей, которые соревнуются друг с другом, и если они достигают правого края экрана, они удаляются из Космоса и повторносгенерированный слева край экрана.

Проблема заключается в том, что в примере кода каждая часть автомобиля (шасси, шарнир, двигатель, колеса) добавляется в пространство отдельно.Я хотел рассматривать весь автомобиль как единое тело, координаты которого я могу отслеживать, сохраняя ссылку на весь кузов автомобиля в Списке и легко добавляя или удаляя его в Пространстве.

Кроме того, если колеса находятся слишком близко к шасси, они сталкиваются друг с другом.Я полагаю, что использование 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 Ответ

1 голос
/ 13 марта 2019

Так что этот вопрос на самом деле два вопроса.

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 с набором групп не будет сталкиваться с другими фигурами с таким же набором групп.

...