Utilización correcta de escenas

Hola!

Empecé hace unos dias a probar con esto de pilas y voy a los ponchasos pero bueno ya le voy a agarrar la mano.

Mi problema, aparte de que la documentación es un poco escueta, es que aparentemente no estoy usando bien la clase escena.

La cosa es asi, el juego va a tener varias pantallas: menu, ayuda, y el juego en si mismo que serán dos niveles.

Estuve usando el tutorial de asteroides, hasta que me di cuenta que esta desactualizado pero masomenos entre eso y la docu nueva salieron las dos pantallas (ayuda y menu).

Ambas tienen botones, que hacen conectar una escena con otra, pero en el interprete no me funcionan, si lo corro con python menu.py (x ejemplo) abre la ventana del juego y al hacer click me abre otra ventana con la otra escena.

Y aca pasan dos cosas:

  1. Quiero que todo ocurra en la misma ventana,no en distintas, no tengo idea como hacerlo!
  2. La consola muestra un error (el interprete no) de que a escena le falta un parametro (2 needed 1 given) que es cuando hago pilas.cambiar_escena(menu.EscenaMenu()) x ejemplo

Si me pueden dar una mano para entender mejor que pasa y como arreglarlo se los agradezco mucho :smiley: y quien sabe si le agarro la mano puedo empezar a contribuir :wink:

Hola @ElitaTnk !!!, para usar escenas te recomiendo ver los ejemplos de este manual que está actualizado:

http://manual.pilas-engine.com.ar/escenas/

La idea general es que cada escena que construyas esté representada por una clase, por ejemplo:

class PantallaBienvenida(pilasengine.escenas.Escena):

    def iniciar(self):
        self.fondo = self.pilas.fondos.Volley()
        pass

    def ejecutar(self):
        pass

y siempre, debajo de la clase tendrías que vincularla para que pilas sepa que exista así:

pilas.escenas.vincular(PantallaBienvenida)

De esta forma, cada vez que quieras ir a esta escena tendrías que ejecutar una sentencia cómo:

pilas.escenas.PantallaBienvenida()

el método “definir_escena” que nos comentás ya no se usa.

Pienso que tendríamos que hacer un ejemplo de esto para la sección de ejemplos… me lo agendo.

SI lo de la clase lo tengo pero debe ser eso del metodo para llamar la escena. Lo voy a probar! muchas gracias :smiley:

Hice el cambio que sugeriste y sigo teniendo el mismo problema, abre 1 ventana x escena y tengo el siguiente error:

Traceback (most recent call last):
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/widget.py”, line 148, in mousePressEvent
self.pilas.eventos.click_de_mouse.emitir(boton=event.button(), x=x, y=y)
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/eventos/evento.py”, line 27, in emitir
respuesta(**evento)
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/eventos/evento.py”, line 156, in call
return mtd(AttrDict(evento))
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/actores/menu.py”, line 184, in cuando_hace_click_con_el_mouse
self.seleccionar_opcion_actual()
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/actores/menu.py”, line 119, in seleccionar_opcion_actual
opcion.seleccionar()
File “/usr/local/lib/python2.7/dist-packages/pilas-1.1.0-py2.7.egg/pilasengine/actores/opcion.py”, line 53, in seleccionar
self.funcion_a_invocar(*self.argumentos)
File “menu.py”, line 39, in ayuda
pilas.escenas.vincular(ayuda.PantallaAyuda())
TypeError: init() takes exactly 2 arguments (1 given)

El c’odigo que estoy manejando es asi:

import pilasengine

pilas = pilasengine.iniciar()
import ayuda
class EscenaMenu(pilasengine.escenas.Escena):
#Escena principal donde se encuentra el menu para iniciar o ver ayuda o bien salir del juego
#creación de la clase para la nueva pantalla a partir de la clase madre pilas.escena.Escena

def iniciar(self):
    #Contenido de la escena principal: logo, menu...
    self.set_logo()
    self.menu_inicial()

def set_logo(self):
    #importamos logo desde carpeta
    imagen = pilas.imagenes.cargar("data/logo.png")
    logo = pilas.actores.Actor()
    logo.imagen = imagen
    logo.y = 200

def menu_inicial(self):
        #creamos opciones y instanciamos el menu principal
        opciones = [
            ("Ver ayuda", self.ayuda),
            ("Salir", self.salir_juego)
        ]
        self.menu = pilas.actores.Menu(opciones, y = 0)

def ayuda(self):
    #lleva a la pantalla de apilas, yuda
    pilas.escenas.vincular(ayuda.PantallaAyuda())
    pilas.escenas.ayuda.PantallaAyuda()

def salir_juego(self):
    #sale del juego
   
pilas.terminar()  
pilas.escenas.vincular(EscenaMenu)
pilas.escenas.EscenaMenu() 
          
pilas.ejecutar()

Alguien podria indicarme que me esta faltando ? Gracias!

Ya resolvi eso jajaja estaba pasando el parametro con () .

El problema que persiste es el de las multiples ventanas, ahora es peor porque es como que cada vez que vinculo las escenas aunque lo haga para el boton.conectar se ejecutan igual y tengo mil ventanas,
y el error:

Exception: Lo siento, ya exista una escena vinculada con el nombre: PantallaAyuda

Hola @ElitaTnk !!!, recién armé un ejemplo de escenas nuevo para la versión 1.2 de pilas-engine; Te recomiendo ver ese ejemplo en detalle, porque tiene una transición entre dos escenas personalizadas que te van a servir:

ver código en github

Por cierto, viendo tu código, me parece que la linea que dice:

pilas.escenas.vincular(ayuda.PantallaAyuda())

debería ser:

pilas.escenas.vincular(ayuda.PantallaAyuda)

Otra cosa no veo mal, me parece raro … ¿probarías con la versión 1.2?

Hola Hugo gracias x la demo.

Actualicé la libreria y mi código, pero me parece que el problema viene por otro lado.

Cuando hago todo en un mismo archivo me funciona bien, pero cuando quiero separarlo en distintos archivos empieza la confusión.

Voy a crear otro tema con todas las preguntas, que tal vez sean bastante básicas, pero escenciales para entender mejor la librería :stuck_out_tongue:

Gracias

ok @ElitaTnk, estaré atento a tu otro mensaje.

Abrazo!

Yo veo un error en esta parte del código

def menu_inicial(self):
    #creamos opciones y instanciamos el menu principal
    opciones = [
        ("Ver ayuda", self.ayuda), #aqui te falta la u antes de las comillas --> (u"Ver ayuda, self.ayuda)
        ("Salir", self.salir_juego) #aqui tambien la misma corrección --> (u"Salir", self.salir_juego)
    ]
    self.menu = pilas.actores.Menu(opciones, y = 0)

Por cierto lo estoy probando en la versión 1.4.12

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

class EscenaMenu(pilasengine.escenas.Escena):
    
    def iniciar(self):
        #Contenido de la escena principal: logo, menu...
        self.set_logo()
        self.menu_inicial()

    def set_logo(self):
        #importamos logo desde carpeta
        #imagen = pilas.imagenes.cargar("data/logo.png")
        logo = pilas.actores.Actor()
        #logo.imagen = imagen
        logo.y = 200

    def menu_inicial(self):
            #creamos opciones y instanciamos el menu principal
            menu = [
                ("Ver ayuda", self.ayuda),
                ("Salir", self.salir_juego)
            ]
            self.menu = pilas.actores.Menu()
    
    def ayuda(self):
        #lleva a la pantalla de apilas, yuda
        pilas.escenas.vincular(ayuda.PantallaAyuda())
        pilas.escenas.ayuda.PantallaAyuda()

    def salir_juego(self):
        #sale del juego
        pilas.terminar()  

pilas.escenas.vincular(EscenaMenu)
pilas.escenas.EscenaMenu() 
          
pilas.ejecutar()

Este seria el código completo, estan comentadas las lineas de imagenes y fondo porque no tengo los archivos con los que lo probaste, si los compartes podria pasar una captura de la escena como la necesitas