#pymunk
#pymunk
Вопрос:
Я использую код из pymunk index_video для создания универсальной функции, которая создает несколько автомобилей, которые участвуют в гонках друг с другом, и если они достигают правого края экрана, они удаляются из пространства и повторно генерируются на левом краю экрана.
Проблема в том, что в примере кода каждая часть автомобиля (шасси, шарнирное соединение, двигатель, колеса) добавляется в пространство отдельно. Я хотел рассматривать весь автомобиль как единый объект, координаты которого я могу отслеживать, сохраняя ссылку на весь кузов автомобиля в списке и легко добавляя или удаляя его в пространство.
Кроме того, если колеса расположены слишком близко к шасси, они сталкиваются друг с другом. Я предполагаю, что использование шейпфильтра может помочь избежать таких столкновений, но для этого мне нужны все части автомобиля как единый кузов.
Пожалуйста, потерпите меня. Я совершенно новичок в этом жаргоне.
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:
Итак, этот вопрос на самом деле состоит из двух вопросов.
A. Как создать «объект car», состоящий из нескольких частей
Для этого нет встроенной поддержки, вы должны отслеживать это самостоятельно.
Один из способов сделать это — создать класс car, который содержит все части автомобиля. Что-то вроде этого (не полный код, вам нужно заполнить полный car)
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 в качестве свойства filter для каждой фигуры, из которой состоит автомобиль. Не имеет значения, принадлежат фигуры одному телу или нет, любая фигура с шейпфильтром с набором групп не будет сталкиваться с другими фигурами с тем же набором групп.
Комментарии:
1. Большое вам спасибо. Собрал и отлично работает! youtu.be/jW4-BblBd_M . Я оценил многие библиотеки 2D физики, прежде чем выбрать pymunk, и должен сказать, что это лучшая из-за простоты установки и использования.