def __init__(self,center,angle,type,team,goal): # Params based on vehicle type self.width = self.widths[type] self.height = self.lengths[type] mass = self.masses[type] self.points = [Vec2d(self.height,self. width), Vec2d(-self.height, self.width), -Vec2d(self.height, self.width), Vec2d(self.height, -self.width)] inertia = moment_for_poly(mass,self.points) # Basic params self.type = type self.team = team self.goal = goal # Flags self.finished = False self.crashed = False # Direction self.direction = Vec2d(1,0) self.direction.rotate(angle) # Position self.position = LanePosition.OffRoad # For reward self.prevPos = center # Create body body = Body(mass, inertia, Body.DYNAMIC) body.position = center body.angle = angle body.velocity_func = friction_car self.shape = Poly(body, self.points) self.shape.color = (0, 255, 0) self.shape.elasticity = 0.05 self.shape.collision_type = CollisionType.Car
def __init__(self, x, y, width=1, height=1, sprite=None, lifetime=1, scene=None, body: pymunk.Body = None, shape: pymunk.Shape = None, angle=0, mass=1, moment=None, elasticity=0, friction=0.6, type_=pymunk.Body.STATIC, damage=None, owner=None, if_damaged='none', if_damaged_many='disappear'): """ Если вы хотите установить свою фарму объекта, то при наследовании перед вызовом super().__init__ нужно определить body и shape, чтобы всё корректно работало. Это нужно сделать, т.к. выяснилось, что в конструктор класса Circle обязательно надо передать body, т.к. c None, он отказывается работать пример кода можно посмотреть в классе DynamicCircularObject Небольшое пояснение, у объекта есть два описанных прямоугольника 1) Начальный self.body_rect, на него натягиваются спрайты 2) Временной self.bounding, его стороны параллельны осям координат, пока нужен только для девмода Если спрайт не указан, то будет рисоваться серый прямоугольник Если форма не указана, то будет использоваться прямоугольник с шириной = width и высотой = height Если момент инерции не указан, то будет расчитан для прямоугольника, описанного выше elasticity и friction используются для внутренних нужд pymunk Типы DYNAMIC, KINEMATIC, STATIC DYNAMIC - полноценных физический объект KINEMATIC - не реагирует на столкновения и гравитацию, перемещаются вручную STATIC - статичный объект, не может передвигаться, из-за этого даёт сильный прирост в производительности :param x: x координата левого нижнего угла объекта :param y: y координата левого нижнего угла объекта :param width: ширина описанного прямоугольника объекта :param height: высота описанного прямоугольника объекта :param sprite: спрайт объекта :param lifetime: время жизни объекта :param scene: игровая сцена :param shape: физическая форма тела :param angle: начальный угол поворота тела против часовой (в радианах) :param mass: масса объекта :param moment: момент инерции :param elasticity: эластичность :param friction: коэффициент трения :param type_: тип объекта (DYNAMIC, KINEMATIC, STATIC) :param damage: урон при попадании в сущность, не являющейся владельцем, мб None :param owner: владелеец (точнее id), мб None :param if_damaged: действие после нанесения урона 1 раз :param if_damaged_many: действие после нанесения урона на 1 итерации цикла проверки урона """ super(PhysicalGameObject, self).__init__(x, y, width, height, sprite=sprite) if isinstance(scene, Space): raise if scene is None: raise AttributeError("Нужно задать обязательно сцену") # Игровая сцена, на которой находится объект self.scene = scene # Оставшееся время жизни объекта self.lifetime = lifetime # Владелец self.owner = owner # Урон self.damage = damage self.if_damaged = if_damaged self.if_damaged_many = if_damaged_many # Подробнее про состояния можно почитать в self._damaged # Цыганская магия self.physical_space = scene.physical_space # Если момент не задан, то считаем его для прямоугольника if moment is None: moment = pymunk.moment_for_box(mass, (self.width, self.height)) if body is None: body = pymunk.Body(mass, moment, type_) body.angle = angle body.position = x + width / 2, y + height / 2 self.body = body # Если форма не задана, то используем прямоугольник if shape is None: shape = pymunk.Poly.create_box(self.body, self.body_rect.size) self.body_shape = shape self.body_shape.elasticity = elasticity self.body_shape.friction = friction self.physical_space.add(self.body, self.body_shape) # Оптимизация связанная с вращение # Если объект повернулся не сильно, то не будем его вращать его спрайт self.rotated_sprite = self.sprite self.last_angle = float('inf')
def __init__(self, pos, team, id): # Foot positions a = (-self.length, self.length) b = (self.length, self.length) c = (-self.length, -self.length) d = (self.length, -self.length) angle = 0 if team > 0 else math.pi headAngle = 0 #(random.random()-0.5) * self.headMaxAngle * 2 # Setup left foot inertia = moment_for_segment(self.mass, a, b, self.radius) body = Body(self.mass, inertia, Body.DYNAMIC) body.position = pos body.angle = angle body.velocity_func = friction_robot self.leftFoot = Segment(body, a, b, self.radius) self.leftFoot.color = (255, int(127 * (1 - team)), int(127 * (1 + team)), 0) self.leftFoot.elasticity = 0.3 self.leftFoot.friction = 2.5 self.leftFoot.collision_type = CollisionType.Robot # Setup right foot inertia = moment_for_segment(self.mass, c, d, self.radius) body = Body(self.mass, inertia, Body.DYNAMIC) body.position = pos body.angle = angle body.velocity_func = friction_robot self.rightFoot = Segment(body, c, d, self.radius) self.rightFoot.color = (255, int(127 * (1 - team)), int(127 * (1 + team)), 0) self.rightFoot.elasticity = 0.3 self.rightFoot.friction = 2.5 self.rightFoot.collision_type = CollisionType.Robot # setup joint self.joint = PivotJoint(self.leftFoot.body, self.rightFoot.body, (pos[0], pos[1])) self.joint.error_bias = 0.1 self.rotJoint = RotaryLimitJoint(self.leftFoot.body, self.rightFoot.body, 0, 0) self.jointRemoved = False # Basic properties self.team = team self.id = id self.headAngle = headAngle # Previous position self.prevPos = self.getPos() # Penalty and pushing parametes self.penalized = False self.penalTime = 0 self.touching = False self.touchCntr = 0 self.mightPush = False self.fallen = False self.fallCntr = 0 self.fallTime = 0 # Movement parameters self.moveTime = 0 self.headMoving = 0 # Kick parameters self.kicking = False self.initPos = None self.foot = None