32 respuestas

  1. Manuel
    28/08/2010

    Una vez estuve haciendo cosas muy similares en C++, lo que defines como clase Director es completamente correcta, pero yo tenía dos aspectos más:

    1.- La clase Director la definí mediante un patrón ‘Singleton’, si no sabes nada de patrones software echa un vistazo en la Wikipedia, te resultará muy útil. Este patrón viene a definir lo siguiente: Sólo puede existir una clase Director, en caso de que alguien cree o invoque una clase Director dentro de la misma aplicación, siempre se devuelve el mismo objeto, lo cual es útil para el siguiente punto:

    2.- Se dispone de una pila de ‘escenas’. El Director no conoce el orden de las escenas, puesto que estas pueden variar dependiendo de los eventos del juego (pausa, cambio de nivel, nivel secreto…), son las propias escenas las que invocan una instancia del objeto Director y apilan la siguiente escena.

    Espero que te sirva de ayuda.

    Estás haciendo un gran trabajo con el blog, ¡ánimo!

  2. adrigm
    28/08/2010

    En cuanto a lo primero, sería bueno que siempre se devolviera el mismo objeto director, pero supongo que eso ya queda a disposición del que lo implemente en su juego y con que propósito. Por ejemplo, en un Engine sería necesario pues sobre él se construirían juegos sin saber como está programado, pero a lo mejor para proyectos más básicos en el que uno solo es el programador él ya sabe que no debe llamar más de una vez al objeto director. A parte de que pienso que no tendría mucho sentido. Pero como bien dices, mejor implementarlo y evitar errores.

    Respecto a lo segundo, es así como está hecho. El que cambia la escena que maneja el director es la propia escena que esta cargada, es en esta donde se selecciona la que debe ser la nueva escena.

    Gracias por los ánimos.

  3. Satanas
    29/09/2010

    Hola amigo, mis felicitaciones por los excelentes tutoriales.

    Te comento que en el código del Director tienes un pequeño error: la línea 35 debe ir identada correctamente, de lo contrario la aplicación saldrá al ejecutar la primera iteración del bucle (pues llamas a self.quit() dentro del for) ;)

    De resto muy bueno el contenido,

    Saludos

  4. adrigm
    29/09/2010

    Cierto, gracias Satanas. Es más el código daría error directamente al estar el cuerpo de if superior vacío.

    Edit: Pues está identado correctamente, es el plugin del código que está haciendo lo que le da la gana.

  5. Francis
    23/10/2010

    Hola Adrigm quiero felicitarte por tu interes en que los otros aprendan y aprovecho para hacerte una pregunta acerca de este capitulo,tengo todo los ficheros listos para usarse pero cuando lanzo main.py la ventana no sale

  6. adrigm
    23/10/2010

    Francis, ¿Te da algún error la consola o se queda el programa ejecutándose? Necesito mas datos para ayudarte. Versiones de python y pygame, SO…

  7. Federico
    24/10/2010

    Hola, te vuelo a felicitar por los tutoriales la verdad muy buenos.

    Tengo una pregunta, vos decis que tenes diferentes escenas, una para el menu, otras para cuando estes jugando, aca viene mi pregunta, vos tenes una escena sola para cuando juegan?

    Por ejemplo vos tenes diferentes niveles, donde aparecen diferentes enemigos y tmb diferentes imagenes, sería una escena diferente por cada nivel?

  8. adrigm
    24/10/2010

    Federico, todo depende de como lo pantees y el estilo de juego. Por ejemplo en un plataforma no tendría sentido cada nivel en una escena ya que los controles no varían ni el tratamiento de la escena. Lo que cambiaría sería el mapeado y sprites (no confundir con la escena) por lo que yo lo combinaría todo dentro de la misma escena. Los cambios de escena los dejaría para cambios importante, como un menu, un minijuego donde los controles son diferentes, etc.

    En el ejemplo del artículos puedes ver como el menu y el mapeado del juego son diferentes, pero independientemente del mapa que cargues la escena es la misma, es decir puedes realizar las mismas acciones en un mapa y otro.

    Como ya digo todo depende del juego, pero imagina que tienes 200 niveles, haces 200 escenas?

  9. yaderv
    19/04/2011

    Había seguido el tutorial del juego de pong y todo excelente, hasta que me le hice un menú y quise incorporar esto.. el resultado, estoy más confundido y perdido que nunca :(

  10. adrigm
    19/04/2011

    Decir que estás confundido no ayuda, paste por el foro y expón tu problema código y demás y trataré de ayudarte.

  11. yaderv
    20/04/2011

    Vale que era un problema de lógica, bastó con ver los artículos de arkanoid para saber a que te refieres en este post.

    Pero aún no entiendo la razón de heredar de una clase padre Scene =/

  12. adrigm
    20/04/2011

    La herencia es para darle funcionalidad, puedes definir comportamientos genéricos de las escenas, además de que te aseguras de que si no se implementa alguno de los métodos bases se llamará al método de Scene que devolverá un error o lo que tu quieras.

    En otros lenguajes se ve más claro como en C++ donde serían métodos virtuales y es necesario una clase base común.

  13. julian9512
    04/05/2011

    Disculpa tengo un prgrama hecho y me decidi a aplicarle unos menus y unirlo con otra cosas similares que tengo. Tengo unos valores globales, los cuales los guardo en un archivo config.py. El problema esta en que cuando a mi archivo scene_home(tiene otro nombre en realidad) pongo esos valores me dice que no existen como valores globales.

    PS: En la clase scene_home importo a config.py (es por eso que no entiendo cual es el problema)

  14. adrigm
    05/05/2011

    Probablemente estés importando de esta forma:

    import config
    

    por lo que para usar una variable de ese módulo tendrías que hacer:

    config.mi_variable
    

    Para acceder directamente a los valores tendrías que importar así:

    from config import *
    

    Yo prefiero la primera para que no haya conflictos con nombres iguales de diferentes módulos importados y para saber de un vistazo a que módulo pertenece la variable/clase/función.

  15. julian9512
    05/05/2011

    Tienes todo la razon, me lo pase por alto. El problema es que ahora me surgio otra prgunta.
    Como ya mencione antes, yo ya tenia un programa y me decidi a pasarlo. Entonces, el problema ahora surge cuando yo quiero tomar eventos que ocurren dentro de una sola escena.

    Cuando llamo a estos eventos (Hago clik en los sprites) para que estos respondan hay que hacerle dos click y mover el mouse (algo rarisimo). En lo que tenia antes (el programa original) todo anda bien.

    Hasta ahora tengo esto en el def on_event(Perdon, pero no recuerdo la pagina para poder subir el codigo):

    for eventos in pygame.event.get():
    			if eventos.type == MOUSEBUTTONDOWN:          
    				if eventos.button == 1:                           
    					self.cubo1.object(eventos.pos, self.lista21)
                   				self.cubo2.object(eventos.pos, self.lista22)                
    					self.cubo3.object(eventos.pos, self.lista23)                
    					self.cubo4.object(eventos.pos, self.lista24)                
    					self.cubo5.object(eventos.pos, self.lista25)                
    				 	self.cubo6.object(eventos.pos, self.lista26)
    					if self.flechader.rect.collidepoint(eventos.pos) == 1:
    						if self.xcant>self.x6+1:
    							self.x1 += 6
    							self.x2 += 6
    							self.x3 += 6
    							self.x4 += 6
    							self.x5 += 6
    							self.x6 += 6
    					
    					if self.flechaizq.rect.collidepoint(eventos.pos) == 1:
    						if self.x1 != 0:
    							self.x1 -= 6
    							self.x2 -= 6
    							self.x3 -= 6
    							self.x4 -= 6
    							self.x5 -= 6
    							self.x6 -= 6
    

    Y esta es la clase Cubo (de la cual heredan cubo1, cubo2…):

    class Cubo(pygame.sprite.Sprite):
    	def __init__(self, x, y, z):
    		pygame.sprite.Sprite.__init__(self)
    		self.image = graphics.load_image("Imagenes\\"+ x + ".jpg", False)
    		self.rect = self.image.get_rect()
    		self.rect.centerx = y
    		self.rect.centery = z
    	def object(self,x, y):
    		if self.rect.collidepoint(x) == 1:
    			os.startfile(y + ".txt")
    
    
  16. adrigm
    05/05/2011

    No deberías usar el gestor de eventos para obtener los eventos de entrada que necesitan manejarse en tiempo real, miráte esto:

    http://www.pygame.org/docs/ref/mouse.html

  17. julian9512
    05/05/2011

    Muchisimas gracias, a pesar de que ya habiavisto esa pagina y conocia un par de esos comando, nunca se me hubiera ocurrido que al aplicarlos se corregiria.
    Sos lo mas grande.
    Gracias y buen post.

  18. julian9512
    05/05/2011

    Disculpa, pero te molesto de vuelta.
    Ahora la duda es yo tengo una lista que busca todos elementos en un directorio especificsdo. Los elementos de esta se conforman con el directorio y el nombre y extension del archivo el problrma esta en que yo no quiero la direccion, solo el nombre y extension.
    El problema esta en que no se como extraer lo que no quiero de este elemento (el directorio)
    Espero tu resluesta y si no se entendio avisa y lo explico mejor.

  19. adrigm
    06/05/2011

    Si no tiene que ver con el tema del post, mejor abre un tema en el foro y alli te podré ayudar para que todo tenga un orden.

    Por lo que entiendo quieres extraer el nombre de un archivo de una ruta, tengo una función para ello, mañana te la pongo que la tendo en el otro ordenador, pero si la quieres hacer tu basicamente consiste en recorrer la cadena de la ruta y buscar la posición del ultimo caracter “/” o “\” que son los caracteres de directorios a partir de ahi será el nombre del archivo, mañana si te lo pongo en el tema del foro que crees si no encuentras la solución.

  20. adrigm
    06/05/2011

    Mira la tenía en Dropbox:

    # Extra el name de un archivo de una ruta.
    def extract_name(ruta):
        a = -1
        for i in range(len(ruta)):
            if ruta[i] == "/" or ruta[i] == "\\":
                a = i
        if a == -1:
            return ruta
        return ruta[a+1:]
    
  21. julian9512
    06/05/2011

    Puede ser que haya algo mal porque cuando lo aplico lo que me dice es el nombre del disco(en mi caso = G). Y encima lo que me confunde mas es que al escribir esto el resultado que me imprime es los mismo q al principio(“wow”):

    wow = (“G:\\hola\\hol.exe”)

    def extract_name(ruta):
    a = -1
    for i in range(len(ruta)):
    if ruta[i] == “/” or ruta[i] == “\\”:
    a = i
    if a == -1:
    return ruta
    return ruta[a+1:]
    while True:
    exe = extract_name(wow)
    print exe

  22. julian9512
    07/05/2011

    No te preocupes por la anterior pregunta ya lo arregle.

    Ahora el problema esta en cuando se lla ma desde una escena a def_change para cambiar. Mi primera pregunta es, ¿En vez de llamar a director.change_scene(scene), no se deberia llamar a director.Director.change_scene(scene)?, ya que def_change esta dentro de la clase Director.
    Y mi segunda pregunta es, yo tengo esto dentro da la clase Menu(lo primero que se ve) Alli hay un string y yo quiero que al apretarlo se cargue la otra escena hasta ahora tengo esto:

    def on_event(self):

    mouse1, mouse2, mouse3 = pygame.mouse.get_pressed()
    mouse_pos = pygame.mouse.get_pos()

    if mouse1 == 1:
    if self.filmshow_rect.collidepoint(mouse_pos) == 1:
    director.Director.change_scene(filmshow.Filmshow(dir))

    El problema esta en que python me devuelve cuando lo llamo esto:

    AtributeError: “Module” object has no atribute “Filmshow”

    ¿Qué es lo estoy pasando por alto?

  23. adrigm
    07/05/2011

    Mirate el constructor de la clase Scene (la clase de la que heredan todas las escenas) tiene una referencia al objeto director para acceder al cambio de escena, por lo que se accede con self.director.change_scene()

    Al contrario que en el otro caso, si es para pinchar en un texto supongo que estarás haciendo un menú, no necesitas gestión en tiempo real por lo que deberías tratarlo como evento.

    Y por favor, si no tiene que ver con el post utiliza el foro, no te podré ayudar más aquí con temas no relacionados con el post.

  24. David
    20/06/2012

    Para usar la función quit() de Director desde otra clase, ¿esa clase deberia heredar de Director?

  25. fvparg
    14/03/2016

    Hola, tengo una consulta, adrigm, sigues aquí? Gracias

  26. Marcos R.
    13/02/2017

    Ha pasado ya un tiempo desde que se publicó este artículo, pero es que ando algo perdido. Comprendo la creación de la clase Director, de la clase Scene y de la clase SceneHome que hereda de Scene. Lo que no llego a entender es por qué se le pasa un objeto director como parámetro a la clase Scene.
    Se le pasa como parámetro una instancia de Scene al método change_scene de la clase Director, ¿no es eso ya suficiente?

    Un saludo

  27. achisp
    12/01/2018

    Hola adrigm.
    Muchas gracias por compartir este gestor de escenas.
    Lo soy usando para hacer un juego de aventura con Pygame.

    Saludos

Responder

 

 

 

Volver arriba
móvil escritorio