Ayuda con las colisiones

Hola, estoy intentando hacer un juego con vista desde arriba, y no consigo que el personaje se pare al chocar contraa un objeto solido, lo he intentado de varias formas, a ver si le hechais un vistazo al codigo:
Lo he intentando incluso dandole una habilidad de Caja pero no funciona, y en los ejemplos el mono se come la banana pero no sale como hacer una colision “solida” xD, por si acaso os dejo una imagen:

Quiero que el personaje choque contra los arboles, la casa etc. Ademas he intentado usar el Tile map pero no lee las capas bien y no produce colisiones. Muchas gracias.

import pilasengine
pilas = pilasengine.iniciar()


class Corvo(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = "engine/charas/corvo_down0.png"
    def frase1(self):
        self.decir("Umm... deberia pasarme por la Ciudadela")
    def frase2(self):    
        self.decir("seguro que la feria ha llegado ya")
    def actualizar(self):
        if pilas.control.izquierda:
            self.x -= 3
            self.espejado = True
        if pilas.control.derecha:
            self.x += 3
            self.espejado = False
        if pilas.control.arriba:
            self.y += 3
            self.espejado = False
        if pilas.control.abajo:
            self.y -= 3
            self.espejado = True


class Colision(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = "colisiones.png"
    
    
        
 
casacorvo = pilas.actores.MapaTiled("casaexteriorcorvo.tmx")
corvo = Corvo(pilas)
corvo.x = -25
corvo.y = -20
corvo.frase1()
colision = Colision(pilas)
colision.x = -20
colision.y = -15
colision.aprender(pilas.habilidades.RebotarComoCaja)
pilas.ejecutar()

Hola @TermoRami ; Lo primero que tienes que ver es qué errores produce tu código (si lo ejecutas desde el editor, en la ventana de debajo de la escena debería aparecer). Cuando se produce un error, pilas (y cualquier otra librería) pasa a funcionar incorrectamente.
¿Puedes decirnos qué mensaje de error te sale?
En el código que pasas, tu actor colision podría rebotar como caja con otros actores que también reboten como caja, algo que no es el caso de corvo.

Es que no me da ningun error por eso me extraña, sabrias tambien como puedeo hacer que el codigo una vez este terminado se convierta en un .exe?

Hola @TermoRami, estoy armando un ejemplo para mostrar cómo usar
los mapas con tiles sólidos:

Tuve que cambiar un poco la forma de definir los bloques sólidos, y me parece que quedó
un poco mejor… la idea es que puedas indicar qué bloques van a ser sólidos usando el prefijo
“solido”, así:

Aquí hay mas detalles de cómo usarlo:

http://hugoruscitti.github.io/pilas-manual/mapas_y_plataformas/index.html#creando-bloques-solidos-con-tiled

Y las versiones para descargar:

http://hugoruscitti.github.io/pilas-website-test/#/descargas

(la última versión es la 0.90.27, si ven una anterior pulsen CTRL+F5)

Con respecto a convertir los juegos a .exe, hay otro post en donde habíamos
visto como hacerlos fácil: ¿tal vez podemos hacer un script para simplificarlo no?

Ha sido de utilidad, he logrado avanzar un poco, pero me sigue sin detectar las colisiones y he seguido al dedillo el tutorial nuevo que has hecho, el problema es que en el tutorial funciona siempre y cuando quieras que el actor salte o ruede, pero al quitar esas lineas otra vez vuelve a atravesar las colisiones,puedes ver el codigo y decirme como seria para que el actor no saltase y pudiese colisionar con los elementos? Muchas gracias por lo del script me viene perfecto:

import pilasengine
pilas = pilasengine.iniciar()


class Corvo(pilasengine.actores.Actor):


    def iniciar(self):
        self.imagen = "engine/charas/corvo_down0.png"
        self.figura = pilas.fisica.Circulo(self.x, self.y, 30
           ,
            friccion=0, restitucion=0)
        
    def actualizar(self):
        velocidad = 10
        
        if pilas.control.izquierda:
            self.x -= 5
            self.x = self.figura.x
            self.espejado = True
        if pilas.control.derecha:
            self.x += 5
            self.x = self.figura.x
            self.espejado = False
    


casacorvo = pilas.actores.MapaTiled("inicio.tmx", densidad=0,
            restitucion=0, friccion=0, amortiguacion=0)
corvo = Corvo(pilas)
corvo.x = -25
corvo.y = -20
pilas.fisica.definir_gravedad(0, 0)
pilas.ejecutar()

Hola @TermoRami, te paso el método actualizar modificado:

    def actualizar(self):

        if pilas.control.izquierda:
            self.figura.velocidad_x = -10
            self.espejado = True
        elif pilas.control.derecha:
            self.figura.velocidad_x = 10
            self.espejado = False
        else:
            self.figura.velocidad_x = 0

        if pilas.control.arriba:
            self.figura.velocidad_y = 10
        elif pilas.control.abajo:
            self.figura.velocidad_y = -10
        else:
            self.figura.velocidad_y = 0

        self.y = self.figura.y
        self.x = self.figura.x

Le agregué un poco mas de código para que se pueda mover tanto para los costados como para arriba y abajo.

Una de las cosas que cambié, es que la figura física sea en realidad quien controla
el movimiento del actor. De esa forma, cada vez que se quiera mover al personaje, en realidad hay que mover la figura física. Solo de esa forma podemos evitar que pase por arriba de las plataformas.

La otra cosa que cambié, es que las figura física se mueva usando velocidades (también pude
haber usado impulsos), porque de esa forma box2d puede hacer correctamente los cálculos de colisiones de forma natural. Se producen efectos muy raros si cambiamos los atributos “x” o “y” directamente, aún no se muy bien cómo resolverlo para que eso se pueda hacer sin que parezca
una “teletransformación” que atraviesa paredes…

Por cierto, vas a notar que el personaje rebota de forma muy rara cuando se lo empuja contra los bordes, voy a investigar alguna forma para evitar esto, usando sensores supongo… lo investigo a ver si puedo.

Muchas gracias, pense que era mas complicado dotar de fisicas al actor, pero por lo que veo es bastante sencillo, el actor se mueve a la perfeccion aunque al principio descendia hacia abajo lentamente pero de forma interrumpida hasta que meti esta linea:

pilas.fisica.definir_gravedad(0, 0) 

Es cierto lo del choque ese raro que forma al colisionarse, pero bueno mientras se mueva y responda bien no me importa, muchas gracias.

Excelente @TermoRami, había olvidado poner la gravedad en 0 :confused:

Lo de las colisiones lo sigo investigando, en cuanto avance escribo un post contando cómo resolverlo.

¡Saludos!

Creo que he encontrado un error a la hora de encontrar la ruta donde se se guarda el archivo .tmx para MapaTiled, pilas solo encuentra el archivo .tmx si no necesita rutas de directorios para usarse, ejemplo grafico:

Ah, puede ser… ¿lo puedo reproducir poniendo un nombre de directorio en la ruta no?.

Yo solo puedo reproducirlo si esta el .py y el .tmx en el escritorio, a la hora de establecer una ruta del .tmx no lo encuentra, por lo menos a mi

Hola, he intentado hacer lo del ejecutador, pero no encuentro en ningun directorio ni nada los archivos run.py, con lo cual no puedo crear el ejecutador, hay otra forma de hacerlo?

Hola @TermoRami, estoy escribiendo un tutorial nuevo para mostrar cómo hacer los ejecutables de pilas para windows… ¿me escribís en otro post separado para que veamos esto en particular?