Foros del Web » Programando para Internet » Python »

Problema pygame

Estas en el tema de Problema pygame en el foro de Python en Foros del Web. Tengo la siguiente clase "Principal" que define la ventana principal del juego. El problema es que al querer mover mi "Personaje" la imagen que lo ...
  #1 (permalink)  
Antiguo 12/03/2012, 16:58
Avatar de eMaa  
Fecha de Ingreso: octubre-2008
Mensajes: 223
Antigüedad: 15 años, 6 meses
Puntos: 1
Problema pygame

Tengo la siguiente clase "Principal" que define la ventana principal del juego. El problema es que al querer mover mi "Personaje" la imagen que lo representa no cambia su posicion. Estoy seguro que el problema es el repintado de la ventana pero no se donde

a continuacion la clase "Principal"

Código:
import pygame
import Personaje

class Principal:


    def __init__(self):
        pygame.display.init()
        pygame.display.set_icon(pygame.image.load("favicon.png"))
        self.personaje = Personaje.Personaje("wowo","Mago","Elfo",50,50)
        self.tamaño = (1000,650)
        self.ventanaPrincipal = pygame.display.set_mode(self.tamaño,pygame.RESIZABLE)

    def draw(self):
        '''
        Descripcion: Crea la ventana,Setea el titulo de la ventana,Agrega al personaje
        Retorna: nada
        Argumentos: no tiene
        '''
        self.ventanaPrincipal.fill((255,255,255))
        pygame.display.set_caption("Fatum Online")
        self.ventanaPrincipal.blit(self.personaje.draw(),(self.personaje.getPosicionX(),self.personaje.getPosicionX()))
        pygame.display.flip()

    def capturarEventos(self):
        '''
        Descripcion: Crea un bucle que se encarga de tomar los eventos y toma desiciones en torno a ellos
        Retorna: nada
        Argumentos: no tiene
        '''
        pygame.display.update()
        #Un bucle para mantener la ventana y tomar los eventos
        while True:
            #Aqui checamos todos los eventos que ocurrieron
            for e in pygame.event.get():
                pygame.display.update()
                #Si el tipo del evento es QUIT (o salir) entonces termina el ciclo
                if e.type == pygame.QUIT:
                    pygame.display.quit()
                    break
                #Si existen tomo los eventos del teclado
                if e.type == pygame.KEYDOWN:
                    #Cuando se pulse en las felchas de teclado seteamos la posicion del personaje y su visualizacion en pantalla
                    if e.key == pygame.K_DOWN:
                        self.personaje.moverArriba()
                        pygame.display.update()
                        break
                    if e.key == pygame.K_UP:
                        self.personaje.moverAbajo()
                        pygame.display.update()
                        break
                    if e.key == pygame.K_RIGHT:
                        self.personaje.moverDerecha()
                        pygame.display.update()
                        break
                    if e.key == pygame.K_LEFT:
                        self.personaje.moverIzquierda()
                        pygame.display.update()
                        break
                    if e.key == pygame.K_ESCAPE:
                        pygame.display.quit()
            

#Inicia el objeto principal
principal = Principal()
principal.draw()
principal.capturarEventos()

y la clase "Personaje"

Código:
import pygame

class Personaje:

    def __init__(self,nombre,clase,raza,posicionX,posicionY):
        self.nombre = nombre
        self.clase = clase
        self.raza = raza
        self.posicionX = posicionX
        self.posicionY = posicionY
        self.cuerpo = pygame.image.load("personaje.png")

    def draw(self):
        '''
        Devuelve el cuerpo del personaje
        '''
        return self.cuerpo

    def getPosicionX(self):
        '''
        Retorna la posicion en X
        '''
        return self.posicionX

    def getPosicionY(self):
        '''
        Retorna la posicion en Y
        '''
        return self.posicionY

    def moverArriba(self):
        '''
        Aumenta la posicion en X
        '''
        self.posicionX += 10

    def moverAbajo(self):
        '''
        Disminuye la posicion en X
        '''
        self.posicionX -= 10

    def moverDerecha(self):
        '''
        Aumenta la posicion en Y
        '''
        self.posicionY += 10

    def moverIzquierda(self):
        '''
        Disminuye la posicion en Y
        '''
        self.posicionY -= 10
  #2 (permalink)  
Antiguo 12/03/2012, 19:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema pygame

Tu código ni siquiera corría. Tienes varias fallas e incluso por ejemplo en los metodos de mover izquierda, derecha, arriba, abajo te mueves en los ejes incorrectos y aveces haces incrementos o decrementos en dirección incorrecta.

self.tamaño no debería de correr. Te debería dar syntax error.

En la clase personaje no deberías tener el nombre de la imagen hardcodeado.

Puedes diseñar tus métodos moverArriba, moverAbajo, moverDerecha, moverIzquierda por un método mover genérico, que reciba 2 parámetros un desplazamiento en X y otro en Y.

Donde tienes en el método draw de la clase main tienes 2 veces self.personaje.getPosicionX(). Mientras que el método draw de la clase personaje no es descriptivo.

En fin podría seguir con la lista, pero no terminaría. Te recomiendo entrar a loserjuegos tienen bastantes ejemplos y explican bien los conceptos básicos.


Código Python:
Ver original
  1. #coding: utf-8
  2. import pygame
  3. import Personaje
  4.  
  5. class Principal:
  6.  
  7.  
  8.     def __init__(self):
  9.         pygame.display.init()
  10.         #pygame.display.set_icon(pygame.image.load("favicon.png"))
  11.         self.personaje = Personaje.Personaje("wowo","Mago","Elfo",50,50)
  12.         self.tamano = (1000,650)
  13.         self.ventanaPrincipal = pygame.display.set_mode(self.tamano,pygame.RESIZABLE)
  14.  
  15.     def draw(self):
  16.         '''
  17.        Descripcion: Crea la ventana,Setea el titulo de la ventana,Agrega al personaje
  18.        Retorna: nada
  19.        Argumentos: no tiene
  20.        '''
  21.         self.ventanaPrincipal.fill((255,255,255))
  22.         pygame.display.set_caption("Fatum Online")
  23.         self.ventanaPrincipal.blit(self.personaje.draw(),(self.personaje.getPosicionX(),self.personaje.getPosicionY()))
  24.         pygame.display.flip()
  25.  
  26.     def capturarEventos(self):
  27.         '''
  28.        Descripcion: Crea un bucle que se encarga de tomar los eventos y toma desiciones en torno a ellos
  29.        Retorna: nada
  30.        Argumentos: no tiene
  31.        '''
  32.         pygame.display.update()
  33.         #Un bucle para mantener la ventana y tomar los eventos
  34.         while True:
  35.             #Aqui checamos todos los eventos que ocurrieron
  36.             for e in pygame.event.get():
  37.                 #Si el tipo del evento es QUIT (o salir) entonces termina el ciclo
  38.                 if e.type == pygame.QUIT:
  39.                     return
  40.                 #Si existen tomo los eventos del teclado
  41.                 if e.type == pygame.KEYDOWN:
  42.                     #Cuando se pulse en las felchas de teclado seteamos la posicion del personaje y su visualizacion en pantalla
  43.                     if e.key == pygame.K_DOWN:
  44.                         self.personaje.moverAbajo()
  45.                         break
  46.                     if e.key == pygame.K_UP:
  47.                         self.personaje.moverArriba()
  48.                         break
  49.                     if e.key == pygame.K_RIGHT:
  50.                         self.personaje.moverDerecha()
  51.                         break
  52.                     if e.key == pygame.K_LEFT:
  53.                         self.personaje.moverIzquierda()
  54.                         break
  55.                     if e.key == pygame.K_ESCAPE:
  56.                         pygame.display.quit()
  57.             self.draw()
  58.             pygame.display.update()
  59.            
  60.  
  61. #Inicia el objeto principal
  62. principal = Principal()
  63. principal.capturarEventos()

Código Python:
Ver original
  1. #coding: utf-8
  2. import pygame
  3.  
  4. class Personaje:
  5.  
  6.     def __init__(self,nombre,clase,raza,posicionX,posicionY):
  7.         self.nombre = nombre
  8.         self.clase = clase
  9.         self.raza = raza
  10.         self.posicionX = posicionX
  11.         self.posicionY = posicionY
  12.         self.cuerpo = pygame.image.load("personaje.png")
  13.  
  14.     def draw(self):
  15.         '''
  16.        Devuelve el cuerpo del personaje
  17.        '''
  18.         return self.cuerpo
  19.  
  20.     def getPosicionX(self):
  21.         '''
  22.        Retorna la posicion en X
  23.        '''
  24.         return self.posicionX
  25.  
  26.     def getPosicionY(self):
  27.         '''
  28.        Retorna la posicion en Y
  29.        '''
  30.         return self.posicionY
  31.  
  32.     def moverArriba(self):
  33.         '''
  34.        Aumenta la posicion en Y
  35.        '''
  36.         self.posicionY -= 10
  37.  
  38.     def moverAbajo(self):
  39.         '''
  40.        Disminuye la posicion en Y
  41.        '''
  42.         self.posicionY += 10
  43.  
  44.     def moverDerecha(self):
  45.         '''
  46.        Aumenta la posicion en X
  47.        '''
  48.         self.posicionX += 10
  49.  
  50.     def moverIzquierda(self):
  51.         '''
  52.        Disminuye la posicion en X
  53.        '''
  54.         self.posicionX -= 10
  #3 (permalink)  
Antiguo 13/03/2012, 05:58
Avatar de eMaa  
Fecha de Ingreso: octubre-2008
Mensajes: 223
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema pygame

Estaba viendo que pegue clases totalmente viejas, las nuevas tienen varios de esos cambios que me nombras.

El problema que tengo es que no puedo mover el sprite que tengo creado , esta siempre en la misma posicion. Use un set_caption de la ventana para que me seteara el titulo cuando apreto la tecla K_UP y asi poder ver si me seteaba la posicion y efectivamente lo hace, pero el personaje esta siempre pintado en la misma posicion
  #4 (permalink)  
Antiguo 13/03/2012, 09:00
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema pygame

Como ya mostré en el código de arriba. Es por que nunca estas llamando al método draw de la clase principal.
  #5 (permalink)  
Antiguo 13/03/2012, 12:56
Avatar de eMaa  
Fecha de Ingreso: octubre-2008
Mensajes: 223
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema pygame

Hola razpeitia, gracias por contestarme


mira aca arregle mucho de los errores que me marcabas (usé sprite con imagen y rectangulo) y mas allá de haber podido comprobar que las coordenadas se mueven bien no logro mover visualmente al personaje, no entiendo porque no se redibuja

Código:
import pygame
import Personaje

class Principal:


    def __init__(self):
        pygame.display.init()
        pygame.display.set_icon(pygame.image.load("favicon.png"))
        self.personaje = Personaje.Personaje("wowo","Mago","Elfo",100,100)
        self.personajeSprite = self.personaje.draw()
        self.tamaño = (1000,650)
        self.ventanaPrincipal = pygame.display.set_mode(self.tamaño)
        self.reloj=pygame.time.Clock()

    def draw(self):
        '''
        Descripcion: Crea la ventana,Setea el titulo de la ventana,Agrega al personaje
        Retorna: nada
        Argumentos: no tiene
        '''
        self.ventanaPrincipal.fill((255,255,255))
        pygame.display.set_caption("Fatum Online") 
        self.ventanaPrincipal.blit(self.personajeSprite.image,self.personajeSprite.rect)
        pygame.display.flip()

    def capturarEventos(self):
        '''
        Descripcion: Crea un bucle que se encarga de tomar los eventos y toma desiciones en torno a ellos
        Retorna: None
        Argumentos: no tiene
        '''
        #Un bucle para mantener la ventana y tomar los eventos
        while True:
            self.reloj.tick()
            #Aqui checamos todos los eventos que ocurrieron
            for e in pygame.event.get():
                self.reloj.tick(60)
                #Si existen tomo los eventos del teclado
                if e.type == pygame.KEYDOWN:
                    #Cuando se pulse en las felchas de teclado seteamos la posicion del personaje y su visualizacion en pantalla
                    if e.key == pygame.K_DOWN:
                        self.personaje.mover(0,-10)
                        pygame.display.update()
                        
                    if e.key == pygame.K_UP:
                        self.personaje.mover(0,10)
                        pygame.display.update()
                        
                    if e.key == pygame.K_RIGHT:
                        self.personaje.mover(10,0)
                        pygame.display.update()
                        
                    if e.key == pygame.K_LEFT:
                        self.personaje.mover(-10,0)
                        pygame.display.update()
                        
                    if e.key == pygame.K_ESCAPE:
                        pygame.display.quit()
                #Si el tipo del evento es QUIT (o salir) entonces termina el ciclo
                if e.type == pygame.QUIT:
                    pygame.display.quit()
                    break
        


#Inicia el objeto principal
principal = Principal()
principal.draw()
principal.capturarEventos()

La clase personaje:
Código:
import pygame

class Personaje:


    def __init__(self,nombre,clase,raza,posicionX,posicionY):
        #Atributos de dibujo
        self.cuerpoImagen = pygame.image.load("personaje.png")
        self.cuerpoImagen = pygame.image.load("personaje.png")
        self.cuerpoRect = self.cuerpoImagen.get_rect()
        self.cuerpoRect.top = posicionY
        self.cuerpoRect.left = posicionX
        self.cuerpoSprite = pygame.sprite.Sprite()
        self.cuerpoSprite.image = self.cuerpoImagen
        self.cuerpoSprite.rect = self.cuerpoRect
        #Atributos del personaje
        self.nombre = nombre
        self.clase = clase
        self.raza = raza

    def draw(self):
        '''
        Devuelve el cuerpo del personaje
        '''
        return self.cuerpoSprite

    def getPosicionX(self):
        '''
        Retorna la posicion en X
        '''
        return self.cuerpoRect.left

    def getPosicionY(self):
        '''
        Retorna la posicion en Y
        '''
        return self.cuerpoRect.top

    def mover(self,x,y):
        '''
        Altera al posicion del personaje
        '''
        self.cuerpoSprite.rect.move_ip(x,y)
  #6 (permalink)  
Antiguo 13/03/2012, 13:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema pygame

Creo que no has checado el código que puse en el primer mensaje y mucho menos leído mi segundo mensaje.

Nunca estas llamando al método draw de la clase principal en tu ciclo principal.
  #7 (permalink)  
Antiguo 13/03/2012, 13:56
Avatar de eMaa  
Fecha de Ingreso: octubre-2008
Mensajes: 223
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema pygame

No habia entendido pense que te referias a llamarlo abajo.

Lo puse en el ciclo pero esto lo que genera es que se pinte de nuevo el sprite en una posicion diferente, asi se manejan las animaciones no? tendria que repintar siempre el fondo para que no se vean dibujados los anteriores sprite


Una ultima pregunta. El sprite cambia su posicion cada vez que yo le doy a la flecha del teclado, pero solo cuando la tecleo y no cuando la mantengo pulsada,.

Última edición por eMaa; 13/03/2012 a las 14:15
  #8 (permalink)  
Antiguo 13/03/2012, 14:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema pygame

Cita:
Iniciado por eMaa Ver Mensaje
Lo puse en el ciclo pero esto lo que genera es que se pinte de nuevo el sprite en una posicion diferente, asi se manejan las animaciones no?
Si así se manejan las animaciones, por cuadros por segundo FPS.

Cita:
Iniciado por eMaa Ver Mensaje
tendria que repintar siempre el fondo para que no se vean dibujados los anteriores sprite.
Así es.

Cita:
Iniciado por eMaa Ver Mensaje
Una ultima pregunta. El sprite cambia su posicion cada vez que yo le doy a la flecha del teclado, pero solo cuando la tecleo y no cuando la mantengo pulsada,.
Es por que lo estas manejando por eventos.

Tienes 2 maneras usar usar key.set_repeat, o mi favorita usar key.get_pressed.

Etiquetas: gui, pygame
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:34.