Pygame. No se elimina la imagen anterior...

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Pygame. No se elimina la imagen anterior...

Notapor Stoudemire » Lun Ene 14, 2008 5:02 pm

Saludos. Tengo un problema con el siguiente codigo. El caso es que la imagen se mueve pero no desaparece la anterior. Como puedo solucionarlo?. Gracias.

Código: Seleccionar todo

xpos=130
ypos=90
posborde=1

while True:
   

   
    for event in pygame.event.get():
       
        pass
        tecla_pressionada = pygame.key.get_pressed()
     
        if tecla_pressionada[K_LEFT]:
            if posborde == 1:
                xpos = 390
                posborde=3
            else:
                xpos -= 130
                posborde -=1
        if tecla_pressionada[K_RIGHT]:
            if posborde==3:
                xpos=130
                posborde=1
            else:
                xpos+=130
                posborde+=1
     
        screen.blit(borde, (xpos,ypos))
        pygame.display.flip()

Stoudemire
 
Mensajes: 4
Registrado: Lun Ene 14, 2008 4:56 pm

Re: Pygame. No se elimina la imagen anterior...

Notapor hugoruscitti » Lun Ene 14, 2008 6:10 pm

Stoudemire escribió:El caso es que la imagen se mueve pero no desaparece la anterior. Como puedo solucionarlo?.
Hola, justo antes de comenzar a escribir sobre "screen"
podrías limpiar la pantalla con un color uniforme:

Código: Seleccionar todo
screen.fill((200, 200, 200))
screen.blit(borde, (xpos,ypos))

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor endaramiz » Lun Ene 14, 2008 6:11 pm

Hola, antes de nada, veo que es tu primer mensaje, Bienvenido al foro.
Primero: sería conveniente que pusieses el código completo en el mensaje, así se puede ver como funciona todo el programa y correrlo para simular el error.
Pero por lo que he leído veo cosas que me parecen extrañas: ese "pass" me intriga, tengo entendido que se utiliza para hacer declaraciones nulas, que función tiene? Y la otra cosa es que el "pygame.display.flip()" se suele poner dentro del bucle principal, pero no dentro del control de eventos, sino al mismo nivel que este.

Segundo: a parte del foro, en la web hay bastante material que ayuda mucho, en especial hay este que trata sobre el problema que tu dices.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Stoudemire » Lun Ene 14, 2008 7:48 pm

Gracias por responder. Lo del PASS ese, es que lo cogi del ejemplo que habia en una web que explicaba el movimiento.

Ya lo e solucionado, de forma algo sucia pero nose si sera la correcta. Os pongo el codigo y ya me comentais:

Código: Seleccionar todo

while True:
    ##screen.fill((0, 0, 0))

   
    for event in pygame.event.get():
       
        pass
   
    tecla_pressionada = pygame.key.get_pressed()
     
    if tecla_pressionada[K_LEFT]:
        if posborde == 1:
            xpos = 390
            posborde=3
        else:
            xpos -= 130
            posborde -=1
           
        screen.fill((0, 0, 0))
        ##pygame.display.update()
        screen.blit(text, (90, 10))
        screen.blit(oscar, (130,90))
        screen.blit(roman, (260,90))
        screen.blit(mixel, (390,90))
        screen.blit(borde, (xpos,ypos))
        mostrar_habilidades(posborde)
        soundborde.play()
        ##pygame.display.flip()
        ##pygame.display.update()
       
    elif tecla_pressionada[K_RIGHT]:
        if posborde==3:
            xpos=130
            posborde=1
        else:
            xpos+=130
            posborde+=1
           
        screen.fill((0, 0, 0))
        ##pygame.display.update()
        screen.blit(text, (90, 10))
        screen.blit(oscar, (130,90))
        screen.blit(roman, (260,90))
        screen.blit(mixel, (390,90))
        screen.blit(borde, (xpos,ypos))
        mostrar_habilidades(posborde)
        soundborde.play()
        ##pygame.display.flip()
        ##pygame.display.update()
           
    ##screen.fill((0, 0, 0))
    ##screen.blit(borde, (xpos,ypos))
    ##pygame.display.flip()
    pygame.display.update()
        ##screen.blit(borde, (130,90))
    pygame.time.wait(100)

Stoudemire
 
Mensajes: 4
Registrado: Lun Ene 14, 2008 4:56 pm

Notapor Stoudemire » Mar Ene 15, 2008 1:36 am

Como podria solamente borrar una determinada imagen o zona de la pantalla? Lo digo para no tener que pintar el fondo y volver a poner imagenes sobre el de nuevo tras realizar una minima modificacion.

gracias.
Stoudemire
 
Mensajes: 4
Registrado: Lun Ene 14, 2008 4:56 pm

Notapor Geo » Mar Ene 15, 2008 6:42 am

Al dibujar un elemento, sabes en qué posición lo dibujaste, sólo borra el espacio que ocupaba antes de moverse a su nueva posición, es decir, usa las coordenadas anteriores y sólo borra esa parte. O dibuja esa sección de la imagen de fondo.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor hugoruscitti » Mar Ene 15, 2008 2:04 pm

Stoudemire escribió:Como podria solamente borrar una determinada imagen o zona de la pantalla? Lo digo para no tener que pintar el fondo y volver a poner imagenes sobre el de nuevo tras realizar una minima modificacion.


Primero ten en cuenta que limpiar toda la pantalla con un solo color es muy
rápido, y no supone nada de esfuerzo para ti ni para el sistema. Tal vez
el problema original de tu programa es que realizas la impresión
en pantalla dos veces ...

Si de todas formas quieres agilizar la impresión en pantalla tal vez te
sirva leer acerca de la técnica "Dirty Rectangles":

http://prog.vjuegos.org/index.php?optio ... Itemid=148

En pygame puedes implementar esto por tu cuenta, o bién hacer uso del grupo
RenderUpdates. Te dejo los comandos que debes ejecutar en consola para acceder
a la ayuda de este módulo:

Código: Seleccionar todo
$ python
>>> import pygame
>>> help(pygame.sprite.RenderUpdates)


El grupo RenderUpdates se encarga de imprimir objetos Sprites sobre la
pantalla y restaurar solo las zonas de pantalla que han sido modificadas.

Tal vez te sirva ver los ejemplos sobre pygame de nuestra charla en el evento
CaFeCONF, ahí usamos grupos en pygame:

http://www.losersjuegos.com.ar/referenc ... f_2007.php

Para finalizar, reitero mi recomendación inicial: no te preocupes tanto por los
detalles ahora, en su lugar experimenta con la biblioteca para hacer algo útil
(como un mini-juego). Luego ganarás experiencia para hacer cosas mas complejas
como optimizar las impresiones en pantalla con la técnica que te comenté.

Un Saludo.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Stoudemire » Mar Ene 15, 2008 6:45 pm

hugoruscitti escribió:
Primero ten en cuenta que limpiar toda la pantalla con un solo color es muy
rápido, y no supone nada de esfuerzo para ti ni para el sistema. Tal vez
el problema original de tu programa es que realizas la impresión
en pantalla dos veces ...



Si limpiar toda la pantalla es tarea facil, pero luego me toca recolocar de nuevo las imagenes en su sitio. Por esto que buscaba una solucion para solo modificar ciertas zonas de la pantalla en las que se van a llevar a cabo los cambios.

Leere lo que me comentas acerca de "Dirty Rectangles" que me parece bastante interesante.

Ya empiezo a coger el truco a este lenguaje. Es como todo, una vez que sabes c++ por ejemplo ya solamente es buscar las similitudes para guiarte.

Gracias por la ayuda.
Stoudemire
 
Mensajes: 4
Registrado: Lun Ene 14, 2008 4:56 pm


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado