Exemplo n.º 1
0
    def __init__(self, x, y, puntos, dinamica=True, densidad=1.0,
            restitucion=0.56, friccion=10.5, amortiguacion=0.1,
            fisica=None, sin_rotacion=False):

        Figura.__init__(self)

        self._escala = 1

        self.puntos = puntos
        self.dinamica = dinamica
        self.fisica = fisica
        self.sin_rotacion = sin_rotacion

        if not self.fisica:
            self.fisica = pilas.escena_actual().fisica

        self.vertices = [(convertir_a_metros(x1) * self._escala, convertir_a_metros(y1) * self._escala) for (x1, y1) in self.puntos]

        fixture = box2d.b2FixtureDef(shape=box2d.b2PolygonShape(vertices=self.vertices),
                                     density=densidad,
                                     linearDamping=amortiguacion,
                                     friction=friccion,
                                     restitution=restitucion)

        self.userData = { 'id' : self.id }
        fixture.userData = self.userData

        if self.dinamica:
            self._cuerpo = self.fisica.mundo.CreateDynamicBody(position=(0, 0), fixtures=fixture)
        else:
            self._cuerpo = self.fisica.mundo.CreateKinematicBody(position=(0, 0), fixtures=fixture)

        self._cuerpo.fixedRotation = self.sin_rotacion
Exemplo n.º 2
0
    def __init__(self,
                 x,
                 y,
                 ancho,
                 alto,
                 dinamica=True,
                 densidad=1.0,
                 restitucion=0.5,
                 friccion=.2,
                 amortiguacion=0.1,
                 fisica=None,
                 sin_rotacion=False):

        Figura.__init__(self)

        x = convertir_a_metros(x)
        y = convertir_a_metros(y)
        self._ancho = convertir_a_metros(ancho)
        self._alto = convertir_a_metros(alto)
        self._escala = 1

        self.dinamica = dinamica
        self.fisica = fisica
        self.sin_rotacion = sin_rotacion

        if not self.fisica:
            self.fisica = pilas.escena_actual().fisica

        if not self.dinamica:
            densidad = 0

        fixture = box2d.b2FixtureDef(
            shape=box2d.b2PolygonShape(box=(self._ancho / 2, self._alto / 2)),
            density=densidad,
            linearDamping=amortiguacion,
            friction=friccion,
            restitution=restitucion)

        # Agregamos un identificador para controlarlo posteriormente en las
        # colisiones.
        self.userData = {'id': self.id}
        fixture.userData = self.userData

        if self.dinamica:
            self._cuerpo = self.fisica.mundo.CreateDynamicBody(
                position=(x, y), fixtures=fixture)
        else:
            self._cuerpo = self.fisica.mundo.CreateKinematicBody(
                position=(x, y), fixtures=fixture)

        self._cuerpo.fixedRotation = self.sin_rotacion
Exemplo n.º 3
0
    def __init__(self,figura_1, figura_2, figura_1_punto=(0,0), figura_2_punto=(0,0), angulo_minimo=None,angulo_maximo=None, fisica=None, con_colision=True):
        """ Inicializa la constante
        :param figura_1: Una de las figuras a conectar por la constante.
        :param figura_2: La otra figura a conectar por la constante.
        :param figura_1_punto: Punto de rotación de figura_1
        :param figura_2_punto: Punto de rotación de figura_2
        :param angulo_minimo: Angulo minimo de rotacion para figura_2 con respecto a figura_1_punto
        :param angulo_maximo: Angulo maximo de rotacion para figura_2 con respecto a figura_1_punto
        :param fisica: Referencia al motor de física.
        :param con_colision: Indica si se permite colisión entre las dos figuras.
        """
        if not fisica:
            fisica = pilas.escena_actual().fisica

        if not isinstance(figura_1, Figura) or not isinstance(figura_2, Figura):
            raise Exception("Las dos figuras tienen que ser objetos de la clase Figura.")

        constante = box2d.b2RevoluteJointDef()
        constante.Initialize(bodyA=figura_1._cuerpo, bodyB=figura_2._cuerpo,anchor=(0,0))
        constante.localAnchorA = convertir_a_metros(figura_1_punto[0]), convertir_a_metros(figura_1_punto[1])
        constante.localAnchorB = convertir_a_metros(figura_2_punto[0]), convertir_a_metros(figura_2_punto[1])       
        if angulo_minimo != None or angulo_maximo != None:
            constante.enableLimit = True
            constante.lowerAngle = math.radians(angulo_minimo)
            constante.upperAngle = math.radians(angulo_maximo)
        constante.collideConnected = con_colision
        self.constante = fisica.mundo.CreateJoint(constante)
Exemplo n.º 4
0
    def obtener_cuerpos_en(self, x, y):
        """Retorna una lista de cuerpos que se encuentran en la posicion (x, y) o retorna una lista vacia [].

        :param x: posición horizontal del punto a analizar.
        :param y: posición vertical del punto a analizar.
        """

        AABB = box2d.b2AABB()
        f = 1
        AABB.lowerBound = (x-f, y-f)
        AABB.upperBound = (x+f, y+f)

        cuantos, cuerpos = self.mundo.Query(AABB, 2)

        if cuantos == 0:
            return []

        lista_de_cuerpos = []

        for s in cuerpos:
            cuerpo = s.GetBody()

            if s.TestPoint(cuerpo.GetXForm(), (x, y)):
                lista_de_cuerpos.append(cuerpo)

        return lista_de_cuerpos
Exemplo n.º 5
0
    def __init__(self,
                 figura_1,
                 figura_2,
                 figura_1_punto,
                 figura_2_punto,
                 longitud_maxima,
                 fisica=None,
                 con_colision=True):
        """ Inicializa la constante
        :param figura_1: Una de las figuras a conectar por la constante.
        :param figura_2: La otra figura a conectar por la constante.
        :param figura_1_punto: Punto de conexiin de la figura_1
        :param figura_2_punto: Punto de conexion de la figura_2
        :param longitud_maxima: Longitu Maxima de distancia que puede alcanzar la conexion
        :param fisica: Referencia al motor de física.
        :param con_colision: Indica si se permite colisión entre las dos figuras.
        """
        if not fisica:
            fisica = pilas.escena_actual().fisica

        if not isinstance(figura_1, Figura) or not isinstance(
                figura_2, Figura):
            raise Exception(
                "Las dos figuras tienen que ser objetos de la clase Figura.")

        constante = box2d.b2RopeJointDef(bodyA=figura_1._cuerpo,
                                         bodyB=figura_2._cuerpo)
        constante.localAnchorA = convertir_a_metros(
            figura_1_punto[0]), convertir_a_metros(figura_1_punto[1])
        constante.localAnchorB = convertir_a_metros(
            figura_2_punto[0]), convertir_a_metros(figura_2_punto[1])
        constante.maxLength = convertir_a_metros(longitud_maxima)
        constante.collideConnected = con_colision
        self.constante = fisica.mundo.CreateJoint(constante)
Exemplo n.º 6
0
 def definir_escala(self, escala):
     self._escala = escala
     self.vertices = [(convertir_a_metros(x1) * self._escala,
                       convertir_a_metros(y1) * self._escala)
                      for (x1, y1) in self.puntos]
     self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape(
         vertices=self.vertices).vertices
Exemplo n.º 7
0
    def __crear_fixture(self):
        fixture = box2d.b2FixtureDef(shape=box2d.b2PolygonShape(box=(self._ancho/2, self._alto/2)),
                                     density=self._cuerpo.fixtures[0].density,
                                     linearDamping=self._cuerpo.fixtures[0].body.linearDamping,
                                     friction=self._cuerpo.fixtures[0].friction,
                                     restitution=self._cuerpo.fixtures[0].restitution)

        fixture.userData = self.userData

        self.fisica.mundo.DestroyBody(self._cuerpo)

        if self.dinamica:
            self._cuerpo = self.fisica.mundo.CreateDynamicBody(position=(self._cuerpo.position.x, self._cuerpo.position.y), angle=self._cuerpo.angle, linearVelocity=self._cuerpo.linearVelocity, fixtures=fixture)    
        else:
            self._cuerpo = self.fisica.mundo.CreateKinematicBody(position=(self._cuerpo.position.x, self._cuerpo.position.y), angle=self._cuerpo.angle, fixtures=fixture)

        self._cuerpo.fixedRotation = self.sin_rotacion
Exemplo n.º 8
0
    def definir_escala(self, escala):
        self._escala = escala
        self.vertices = [(convertir_a_metros(x1) * self._escala, convertir_a_metros(y1) * self._escala) for (x1, y1) in self.puntos]
        fixture = box2d.b2FixtureDef(shape=box2d.b2PolygonShape(vertices=self.vertices),
                                     density=self._cuerpo.fixtures[0].density,
                                     linearDamping=self._cuerpo.fixtures[0].body.linearDamping,
                                     friction=self._cuerpo.fixtures[0].friction,
                                     restitution=self._cuerpo.fixtures[0].restitution)

        fixture.userData = self.userData

        self.fisica.mundo.DestroyBody(self._cuerpo)

        if self.dinamica:
            self._cuerpo = self.fisica.mundo.CreateDynamicBody(position=(self._cuerpo.position.x, self._cuerpo.position.y), angle=self._cuerpo.angle, linearVelocity=self._cuerpo.linearVelocity, fixtures=fixture)    
        else:
            self._cuerpo = self.fisica.mundo.CreateKinematicBody(position=(self._cuerpo.position.x, self._cuerpo.position.y), angle=self._cuerpo.angle, fixtures=fixture)
        
        self._cuerpo.fixedRotation = self.sin_rotacion
Exemplo n.º 9
0
    def __init__(self, x, y, ancho, alto, dinamica=True, densidad=1.0,
            restitucion=0.5, friccion=.2, amortiguacion=0.1,
            fisica=None, sin_rotacion=False):

        Figura.__init__(self)

        x = convertir_a_metros(x)
        y = convertir_a_metros(y)
        self._ancho = convertir_a_metros(ancho)
        self._alto = convertir_a_metros(alto)
        self._escala = 1

        self.dinamica = dinamica
        self.fisica = fisica
        self.sin_rotacion = sin_rotacion

        if not self.fisica:
            self.fisica = pilas.escena_actual().fisica

        if not self.dinamica:
            densidad = 0

        fixture = box2d.b2FixtureDef(shape=box2d.b2PolygonShape(box=(self._ancho/2, self._alto/2)),
                                     density=densidad,
                                     linearDamping=amortiguacion,
                                     friction=friccion,
                                     restitution=restitucion)

        # Agregamos un identificador para controlarlo posteriormente en las
        # colisiones.
        self.userData = { 'id' : self.id }
        fixture.userData = self.userData

        if self.dinamica:
            self._cuerpo = self.fisica.mundo.CreateDynamicBody(position=(x, y), fixtures=fixture)
        else:
            self._cuerpo = self.fisica.mundo.CreateKinematicBody(position=(x, y), fixtures=fixture)

        self._cuerpo.fixedRotation = self.sin_rotacion
Exemplo n.º 10
0
    def __init__(self, figura_1, figura_2, fisica=None, con_colision=True):
        """Inicializa la constante.

        :param figura_1: Una de las figuras a conectar por la constante.
        :param figura_2: La otra figura a conectar por la constante.
        :param fisica: Referencia al motor de física.
        :param con_colision: Indica si se permite colisión entre las dos figuras.
        """
        if not fisica:
            fisica = pilas.escena_actual().fisica

        if not isinstance(figura_1, Figura) or not isinstance(figura_2, Figura):
            raise Exception("Las dos figuras tienen que ser objetos de la clase Figura.")

        constante = box2d.b2DistanceJointDef()
        constante.Initialize(figura_1._cuerpo, figura_2._cuerpo, (0,0), (0,0))
        constante.collideConnected = con_colision
        self.constante = fisica.mundo.CreateJoint(constante)
Exemplo n.º 11
0
    def __init__(self, area, gravedad):
        """Inicializa el motor de física.

        :param area: El area del escenario, en forma de tupla.
        :param gravedad: La aceleración del escenario.
        """
        self.mundo = box2d.b2World(gravedad, False)
        self.objetosContactListener = ObjetosContactListener()
        self.mundo.contactListener = self.objetosContactListener
        self.mundo.continuousPhysics = False

        self.area = area
        self.figuras_a_eliminar = []

        self.constante_mouse = None
        self.crear_bordes_del_escenario()

        self.velocidad = 1.0
        self.timeStep = self.velocidad/120.0
Exemplo n.º 12
0
    def __init__(self, figura_1, figura_2, figura_1_punto, figura_2_punto, longitud_maxima, fisica=None, con_colision=True):
        """ Inicializa la constante
        :param figura_1: Una de las figuras a conectar por la constante.
        :param figura_2: La otra figura a conectar por la constante.
        :param figura_1_punto: Punto de conexiin de la figura_1
        :param figura_2_punto: Punto de conexion de la figura_2
        :param longitud_maxima: Longitu Maxima de distancia que puede alcanzar la conexion
        :param fisica: Referencia al motor de física.
        :param con_colision: Indica si se permite colisión entre las dos figuras.
        """        
        if not fisica:
            fisica = pilas.escena_actual().fisica

        if not isinstance(figura_1, Figura) or not isinstance(figura_2, Figura):
            raise Exception("Las dos figuras tienen que ser objetos de la clase Figura.")

        constante = box2d.b2RopeJointDef(bodyA=figura_1._cuerpo, bodyB=figura_2._cuerpo)
        constante.localAnchorA = convertir_a_metros(figura_1_punto[0]), convertir_a_metros(figura_1_punto[1])
        constante.localAnchorB = convertir_a_metros(figura_2_punto[0]), convertir_a_metros(figura_2_punto[1])
        constante.maxLength = convertir_a_metros(longitud_maxima)
        constante.collideConnected = con_colision
        self.constante = fisica.mundo.CreateJoint(constante)
Exemplo n.º 13
0
 def definir_vertices(self):
     self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape(
         box=(self._ancho / 2, self._alto / 2)).vertices
Exemplo n.º 14
0
 def definir_escala(self, escala):
     self._escala = escala
     self.vertices = [(convertir_a_metros(x1) * self._escala, convertir_a_metros(y1) * self._escala) for (x1, y1) in self.puntos]
     self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape(
         vertices = self.vertices).vertices
Exemplo n.º 15
0
 def definir_vertices(self):
     self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape(
         box=(self._ancho/2,self._alto/2)).vertices