Beispiel #1
0
    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
Beispiel #2
0
    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')
Beispiel #3
0
    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