Ayuda con Clases y metodo __init__()

Hola, antes que nada perdon si no deberia de postear esto…

Tengo un problema de nacimiento con el metodo init() y con las clases, todavia no logro comprender bien para que se usa el init. Por lo que entendi se usa init() luego de la clase para que se llame a la funcion automaticamente.

Pero tengo un problema con un codigo que escribi gran parte yo, y otra parte lo copie de no recuerdo que pagina de aca en pilas.
Necesito comprender esto para entender mas todo lo que es con respecto a clases:

import pilas
pilas.iniciar(ancho=900, alto=600)


class MiActor(pilas.actores.Actor):

    def __init__(self, imagen, x=0, y=0, v=0):

        pilas.actores.Actor.__init__(self, imagen)
        self.x = x
        self.y = y
        self.escala=0.75
        self.rectangulo = pilas.fisica.Rectangulo(x=self.x, y=self.y,
        ancho=self.ancho, alto=self.alto,
        restitucion=-10, friccion=0)
        self.rectangulo.escala=0.75
        self.rectangulo.definir_velocidad_lineal(v, 0)
        self.imitar(self.rectangulo)
    
    
    def actualizar(self):

        if pilas.escena_actual().control.izquierda:
            self.rectangulo.x -=10
        if pilas.escena_actual().control.derecha:
            self.rectangulo.x+= 10
        
nave = MiActor("Gekka beat/frutas.png", x=-260)

pilas.ejecutar()

Básicamente lo que hace el código es crear una navecita en X= -260 y Y= 0 donde le puse un rectangulo que imite a la imagen. La nave cae hasta el suelo y la puedo mover con el teclado.
Ahora, lo que no logro comprender es esta parte del codigo que fue copiada:

class MiActor(pilas.actores.Actor):

    def __init__(self, imagen, x=0, y=0, v=0):

        pilas.actores.Actor.__init__(self, imagen)

Por que a la clase MiActor tiene ese parametro?

Cual es la funcion que cumple lo que esta escrito abajo del def, osea pilas.actores.Actor__init__(self,imagen)?

Basicamente esa es mi duda ya que cree de nuevo otro codigo y me surge un problema por no poner esas 3 lineas de arriba que no entiendo que hacen realmente.
Este es el otro codigo que cree:

import pilas


class Nave():


    def __init__(self,imagen, x=0, y=0):
        self.imagen= pilas.actores.Actor(imagen)
    


    def actualizar(self):
        if pilas.escena_actual().control.izquierda:
            self.imagen.x -= 10
        if pilas.escena_actual().control.derecha:
            self.imagen.x += 10

    def escala(self):
        self.imagen.escala= 0.5



def main():
    pilas.iniciar(900,600)

    nave= Nave("cosas/frutas.png") 
    nave.escala()
    nave.actualizar()
    #nave2= Nave("cosas/nave2.png")




    pilas.fondos.Color(pilas.colores.negro)
    pilas.ejecutar()

main()

En este otro codigo la funcion init_() cumple su objetivo, la funcion escala() cumple con su objetivo pero, el problema que tengo con este otro codigo es que no logro hacer que la funcion actualizar() funcione. No entiendo por que no se mueve la nave, probe un monton de cosas. La unica forma que logre hacer mover la nave es copy pasteando las 3 lineas de codigo que puse arriba y cambiando algunas cosas.
Pero creo que si no entendi esas 3 lineas que copy pastie, no sirve que lo haga de esa forma por que programar sin entender que estoy haciendo es ridiculo…

Gracias al que me ayude, y perdon si no se comprendio del todo lo que trate de explicar

edit: Aprobecho para preguntar una cosa mas:
Agregue cualquier musica para probar como funcionaba:
denpa=pilas.musica.cargar(‘cosas/denpa.ogg’)
denpa.reproducir()
Primero trate de agregarlo en mp3 y no reproducia nada, pilas no es compatible con .mp3?
Y segundo, cuando converti la musica a .ogg al escucharla en un reproductor comun se escucha bien, osea normal.
Pero cuando ejecute el programa en pilas, se escucha la cancion pero como mas lenta, es como si estuviera reproducida a una velocidad menor que 1.0, la voz de ser femenina es como mas de hombre… es raro. Es normal eso ?

1 Like

Te contesto solo lo de el sonido porque lo otro no se mucho xDD creo que pilas solo es compatible con el tipo de sonido “wav”

1 Like

Hola @Gekka, estás bien orientado, el método __init__ es un método especial que se llamará justo en el momento de crear un actor. Ahí es donde colocamos las sentencias iniciales del actor.

Ahora bien, todos los actores de pilas necesitan algunas cosas iniciales para funcionar correctamente: tener un area de colisión, definir el centro de la imagen etc… y como esas tareas son comunes a todos los actores, incluimos esas sentencias dentro de la función Actor.__init__ (que es accesible para todas las clases que heredan de Actor).

Observá que en el código fuente de pilas el método Actor.__init__ tiene estas sentencias de código iniciales que te comentaba:

Por ese motivo, es importante poner la linea pilas.actores.Actor.__init(self, imagen) al principio de tu método __init__, de otra forma al actor le ‘faltarán’ componentes.

Con respecto al segundo código, donde no se llama al método actualizar, creo que modificándolo de esta forma tendría que funcionarte (aunque no lo probé):

import pilas


class Nave(pilas.actores.Actor):

    def __init__(self,imagen, x=0, y=0):
        pilas.actores.Actor.__init__(self, imagen)

    def actualizar(self):
        if pilas.escena_actual().control.izquierda:
            self.x -= 10
        if pilas.escena_actual().control.derecha:
            self.x += 10

    def escala(self):
        self.escala= 0.5



def main():
    pilas.iniciar(900,600)

    nave= Nave("cosas/frutas.png") 
    nave.escala()
    nave.actualizar()
    #nave2= Nave("cosas/nave2.png")




    pilas.fondos.Color(pilas.colores.negro)
    pilas.ejecutar()

main()

Gracias por las respuestas!

Otra duda, hay alguna manera de cambiar la colision para que no sea circular?
Por ejemplo quiero cambiarle la colision a este rectangulo para que cubra el rectangulo, y un circulo no seria ideal…

La idea es que una pelota golpee ese rectangulo y se rompa, pero para hacer eso creo que debo hacerlo con colisiones y no con fisica, o me equivoco?

Gracias de ante mano!

En el caso que dices, puedes usar el método colisiona_con_un_punto(), ya que lo que hace es testear si el punto que le pasas está dentro del área (rectangular) del actor.

1 Like

Gracias @fsalamero pero te reformulo la duda por que no logro hacer funcionar, estuve todo casi todo el dia con esto y no logro hacerlo funcionar correctamente…

1- Hay alguna forma de hacer que un objeto con colision al tocar otro objeto con fisica rebote? siendo que el objeto de fisica no tiene colison

2- Me das por favor algun ejemplo de como podria colisionar 2 objetos usando el area?

El problema que no logro arreglar es este:

La pelota usando colisiones rebota con la navesita de abajo, pero rebota de una forma que no es la ideal debido a que el radio de colision de la nave es circular, obviamente.
Osea, sea la forma que sea que caiga la pelotita, siempre rebota en la misma direccion en la que cayo, y eso es por la colision circular que tiene. Lo ideal seria que la colision de la nave cubra la nave, osea en forma rectangular, no con un radio…

Es por eso que se me ocurrio utilizar Areas que creo que con eso funcionaria, pero no se como utilizarla. Busque en el api de pilas y en la documentacion pero en ningun lado encontre referencia a el Area

Te dejo el codigo por las dudas lo necesites: http://puu.sh/ccv0Q.txt (no descarga nada, se ve online)

Muchisimas gracias

Hola @Gekka !!!, te quería comentar que el area de colisión recién se puede cambiar en la próxima
versión de pilas. En la versión actual son solo circulares : (

Luego de ver tu mensaje armé un mini-arkanoid para ir experimentando si se podría implementar solamente
usando física:

http://youtu.be/sGDgHY5mF6g

En unas horas, cuando llegue a casa, publicaré una nueva versión beta de pilas así lo podemos mejorar
en equipo.

¡Abrazo!

1 Like

Muchísimas gracias! esperare esa versión, tengo que entregar un final el mes que viene de un juego hecho por pilas, pero antes de hacer el juego real quiero practicar haciendo minis juegos como estos así entiendo mejor pilas. Así que perdón si molesto mucho por acá !

Puedes empezar a utilizarla clonando el git de @hugoruscitti https://github.com/hugoruscitti/python-pilas-experimental y empezar a probarla, de paso la testeas y puedes colaborar reportando los fallos

Exitos

Hola soy muy principiante pongo todo lo que ustedes dicen pero me sigue diciendo que mi imagen no existe :frowning: que hago ? porfavor ! adonde tengo qe gsrdar la imagen :confused: ???

Se debe guardar en el mismo directorio donde esta el juego.py si lo guardas en un subdirectorio, es necesario marcar la ruta (subdirectorio/imagen.png