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
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
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)
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
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)
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
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
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
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
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)
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
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)
def definir_vertices(self): self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape( box=(self._ancho / 2, self._alto / 2)).vertices
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
def definir_vertices(self): self._cuerpo.fixtures[0].shape.vertices = box2d.b2PolygonShape( box=(self._ancho/2,self._alto/2)).vertices