Ayuda con Colisiones y gravedad

No logro que

pilas.fisica.definir_gravedad surja efecto:
ninguna colición es posible este script esta basado en Shaolin

Código:

import pilasengine
from pilasengine.actores.actor import Actor
from pilasengine.comportamientos.comportamiento import Comportamiento

pilas = pilasengine.iniciar(608,480)
pilas.fisica.definir_gravedad(0,90)
mapa_desde_archivo = pilas.actores.MapaTiled("Mov/tile/tileA.tmx")

class Goku(Actor):
    def iniciar(self):
        self.hacer_inmediatamente(Parado)

    def actualizar(self):
        pass

class Parado(Comportamiento):
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("Mov/parado.png", 6, 1)

    def actualizar(self):
        self.receptor.imagen.avanzar(2)
        
        if self.control.derecha or self.control.izquierda:
            self.receptor.hacer_inmediatamente(Caminar)
        elif self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
        elif self.control.abajo:
            self.receptor.hacer_inmediatamente(Agacharse)

class Caminar(Comportamiento):
    
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("Mov/correr.png", 3    , 1)
        
    def actualizar(self):
        self.receptor.imagen.avanzar(12)
        if self.control.derecha:
            self.receptor.x += 2
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 2
            self.receptor.espejado = True
        elif self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
            
        if not self.control.derecha and not self.control.izquierda:
            self.receptor.hacer_inmediatamente(Parado)
            
class Saltar(Comportamiento):
    
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("Mov/saltar.png", 1, 1)
        self.y_inicial = self.receptor.y
        self.vy = 9
        
    def actualizar(self):
        self.receptor.y += self.vy
        self.vy -= 0.7
        distancia_al_suelo = self.receptor.y - self.y_inicial
        self.receptor.altura_del_salto = distancia_al_suelo
        if distancia_al_suelo < 0:
            self.receptor.y = self.y_inicial
            self.receptor.altura_del_salto = 0
            self.receptor.hacer_inmediatamente(Parado)

        if self.control.derecha:
            self.receptor.x += 2
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 2
            self.receptor.espejado = True

class Agacharse(Comportamiento):
    
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("Mov/descanso.png", 1    , 1)
        
    def actualizar(self):
        self.receptor.imagen.avanzar(1)
        if self.control.abajo == False:
            self.receptor.hacer_inmediatamente(Parado)
        elif self.control.derecha or self.control.izquierda:
            self.receptor.hacer_inmediatamente(Caminar)
        elif self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)

"""Inicio"""
pilas.actores.vincular(Goku)
goku = pilas.actores.Goku() 
goku.figura_de_colision = goku.pilas.fisica.Rectangulo(0,0,23,1)

pilas.ejecutar()

Hola @killcrops, por lo que veo la figura de colisión no se está actualizando en realidad… haciendo unos pequeños cambios en tu código pude hacerlo funcionar:

pilas.actores.vincular(Goku)
goku = pilas.actores.Goku() 
goku.figura = goku.pilas.fisica.Rectangulo(0,0,23,20)
goku.aprender("imitar", goku.figura)

De todas formas, te recomiendo ver el ejemplo “plataformas” que viene en la versión nueva de pilas, tiene una figura adicional llamada “sensor” que es muy útil para juegos así, te permite detectar el contacto con el suelo:

ah, por cierto, me funcionó mejor con estos valores de gravedad pilas.fisica.definir_gravedad(0,-9).

Gracias por la pronta respuesta Hugo este fue el resultado:

https://github.com/killcrops/Pilas-Plataforma

Pero al colicionar no se mueve, se definio la fricción en 0 no entieno cual sea el problema gracias.

Hola @killcrops, pienso que el personaje no se mueve porque en realidad quién controla el movimiento es la propia figura a imitar.

Es decir, cuando hacemos que un actor “imite” a una figura física, la figura pasa a ser quien controlar la posición “x” e “y” del actor. Nosotros no vamos a poder controlar esas variables de ahí en más.

Lo que si se puede hacer, es cambiar la posición “x” e “y” de la figura física, y como el actor “imita” a la figura, también se moverá.

En tu caso, uno de los arreglos que se pueden hacer es modificar la clase Caminar así:

Observá que lo único que cambié es la sentencia en donde se cambia la posición “x”, lo único que agregué es la palabra “figura”.

En efecto pero es aquí donde creo que hay un falencia en las coliciones y es el comportamiento de una figura. Me pregunto si se origina en las librerias de Box2D o en Pilas al mover la figura las coliciones corresponden al tipo de figura ejemplo:

Al usar un Circulo este rodara al llegara al borde:

Al usar una Rectangulo si caes de lado el Receptor quedara de cabeza:

Al saltar sobre el Tile con la Capa solido la Figura de Colisión simplemente segura de largo:

En todo caso estaré en revisando el código 1 y otra vez hasta encontrar una Solución adecuada y ante mano gracias por el buen soporte que brinda este sitio gracias.