Animación de un cuadrado en Pygame

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

Animación de un cuadrado en Pygame

Notapor algarafa » Lun Dic 22, 2008 11:10 am

Hola a todos. He hecho una simple animación de un cuadrado, que simboliza una nave y que va cayendo con la gravedad. Cuando pulsas la tecla arriba, en vez de caer sube. Esta hecho para la salida gráfica del entorno de programación PythonG. Me gustaría pasarlo a Pygame, dados los problemas tenidos con las salida gráfica de PythonG y dado que Pygame es mejor. Por eso, he elegido este pequeño programa para que me expliquen como podría hacerlo en Pygame. Gracias a todos.

Código: Seleccionar todo
# -*- coding: iso-8859-1 -*-

from modulepythong import *

# Paisaje

altura_paisaje = 400
anchura_paisaje = 400
window_coordinates(0, 0, anchura_paisaje, altura_paisaje)

# Gravedad

g = 0.00001

# Nave

tamanyo_nave = 10
x = anchura_paisaje / 2
y = altura_paisaje - 100
vy = 0
impulso_y = 2*g
nave = create_filled_rectangle(x, y, x+tamanyo_nave, y+tamanyo_nave, 'blue')

# Simulación

while y > 0 and y < altura_paisaje:
  vy -= g
  if keypressed(1) == 'Up':
    vy += impulso_y
  y += vy
  move(nave, 0, vy)
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Animación de un cuadrado en Pygame

Notapor hugoruscitti » Lun Dic 22, 2008 7:26 pm

RAGPacho escribió:Me gustaría pasarlo a Pygame, dados los problemas tenidos con las salida gráfica de PythonG y dado que Pygame es mejor. Por eso, he elegido este pequeño programa para que me expliquen como podría hacerlo en Pygame. Gracias a todos.

Saludos, tomé tu programa y traté de hacer algo parecido
con pygame. Lo malo es que tuve que cambiar algunos
números en tus cálculos porque no me funcionaba igual en
pygame que en pythonG, pero bueno, seguramente identificarás
esas diferencias viendo el código, ahí va:

Imagen

Código: Seleccionar todo
# -*- coding: iso-8859-1 -*-
import pygame
import sys

# Paisaje

altura_paisaje = 400
anchura_paisaje = 400
screen = pygame.display.set_mode((altura_paisaje, anchura_paisaje))

# Gravedad

g = 0.1

# Nave

tamanyo_nave = 20
x = anchura_paisaje / 2
y = altura_paisaje - 100
vy = 0
impulso_y = 2*g
nave = pygame.Rect(x, y, tamanyo_nave, tamanyo_nave)
nave_color = (100, 100, 255)

# Simulación

while True:
    # gestiona los eventos de la aplicacion
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit(0)
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                vy = -5

    # pinta la pantalla
    bg_color = (200, 200, 200)
    screen.fill(bg_color)

    # pinta la nave
    screen.fill(nave_color, nave)

    # mueve el objeto a su nueva posicion
    vy += g
    y += vy
    nave.move_ip(0, vy)

    # si llega al final del escenario se detiene
    if nave.bottom > altura_paisaje:
        nave.bottom = altura_paisaje
        vy = 0

    # muestra los cambios en pantalla y espera
    pygame.display.flip()
    pygame.time.delay(10)
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Animación de un cuadrado en Pygame

Notapor algarafa » Mar Dic 23, 2008 2:49 pm

Código: Seleccionar todo
nave_color = (100, 100, 255)

¿Donde puedo encontrar una tabla de los distintos colores? He revisado la web de pygame pero no encontre nada en la documentación. (El inglés no es mi fuerte)

Muchas gracias. :D
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor endaramiz » Mar Dic 23, 2008 6:47 pm

Para representar el color en pygame se puede utilizar el RGB. El RGB se representa (rojo, verde, azul) donde cada parámetro tiene un rango de 0 a 255. Por esta razón, es fácilmente representable en 2 dígitos hexadecimales por color.
Aquí tienes la imagen de un cubo muy buena aunque también puedes mirar la paleta de, por ejemplo, el Gimp para obtener los valores fácilmente.
http://en.wikipedia.org/wiki/RGB_color_space

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

Gracias

Notapor algarafa » Mar Dic 23, 2008 6:55 pm

Ok, gracias. Cuando haya mejorado un poco esto del cuadrado, abro en la sección videojuegos otro topic para que me ayudeis a mejorarlo.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Mejoras

Notapor algarafa » Mar Dic 23, 2008 7:55 pm

Bueno, he aquí un cuadrado que se mueve lateralmente y que no sale de pantalla:
Código: Seleccionar todo
# -*- coding: iso-8859-1 -*-
import pygame
import sys

# Hasta aquí lo que hemos hecho ha sido importar algunas funciones y
# poner una codificación de caracteres compatible con el castellano.

# Paisaje

altura_paisaje = 400
anchura_paisaje = 400
screen = pygame.display.set_mode((anchura_paisaje, altura_paisaje))
pygame.display.set_caption('Galactic')

# Gravedad

g = 0.1

# Nave

tamanyo_nave = 20
x = anchura_paisaje / 2
y = altura_paisaje - 350
vy = 0
vx = 0
nave = pygame.Rect(x, y, tamanyo_nave, tamanyo_nave)
nave_color = (0, 255, 0)

# Simulación

while True:
   
   # Con esto vamos a controlar los eventos del juego.
   
   for event in pygame.event.get():
      
      if event.type == pygame.QUIT:
         sys.exit(0)
         
      elif event.type == pygame.KEYDOWN:
         if event.key == pygame.K_UP:
            vy = -5
         if event.key == pygame.K_LEFT:
            vx = -5
         if event.key == pygame.K_RIGHT:
            vx = +5
   
   # Ahora pintemos el fondo de la pantalla
   background_color = (255, 255, 255)
   screen.fill(background_color)
   
   # Ahora rellenaremos la nave de un color.
   screen.fill(nave_color, nave)
   
   #Creemos la sensación de movimiento.
   vy += g
   y += vy
   if vx < 0:
      vx += 0.1
   if vx > 0:
      vx -= 0.1
   x + vx
   nave.move_ip(vx, vy)
   
   # Si la nave llega a algún límite detiene el movimiento.
   
   if nave.bottom > altura_paisaje:
      nave.bottom = altura_paisaje
      vy = 0
      
   if nave.top < 0:
      nave.top = 0
      vy = 0
      
   if nave.left < 0:
      nave.left = 0
      
   if nave.right > 400:
      nave.right = 400
   
   # Muestra los cambios en pantalla y espera.
   pygame.display.flip()
   pygame.time.delay(10)
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor endaramiz » Vie Dic 26, 2008 8:46 pm

Muy bien! veo que va avanzando... quizás ahora sería un buen momento para mejorar un poco la estructura y crear el objeto nave(clase, sprite...). Aunque de funcionalidad tenga la misma, el código ganará mucho y te será más fácil seguir agrandando el proyecto.
La idea es simple: hay un color de una nave, un rectángulo de la nave, un fragmento de código que se encarga de mover la nave... pues todo eso, se junta formando la clase nave.
No sigo explicando porque tampoco sé el nivel que tienes y quizás ya sepas todo eso. Así que si tienes dudas, pregunta y te intentaré ayudar (aunque tengo los exámenes en enero así que quizás tarde un poco en responder).
Mirando lo ejemplos de la web, se puede aprender mucho.

Saludos.

Pd: me lo he mirado por encima, pero creo que hay cosas sin usar:
Código: Seleccionar todo
y += vy
x + vx
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

No se usar las clases

Notapor algarafa » Sab Dic 27, 2008 1:06 pm

No se usar las clases, estoy siguiendo de manera autodidacta un .pdf que encontré por ahí, y todavía no he llegado a las clases. Os pondré el .pdf en la sección documentación para que podáis usarlo vosotros también. Bueno, la verdad es que el programa va bastante más avanzado. Ya se va pareciendo a un videojuego. Les pongo el código, y después del mismo les explico mi duda.
Código: Seleccionar todo
# -*- coding: iso-8859-1 -*-
import pygame
import sys

# Hasta aquí lo que hemos hecho ha sido importar algunas funciones y
# poner una codificación de caracteres compatible con el castellano.

# Paisaje

altura_paisaje = 400
anchura_paisaje = 400
screen = pygame.display.set_mode((anchura_paisaje, altura_paisaje))
pygame.display.set_caption('Galactic')

# Gravedad

g = 0.1

# Tanque de combustible

fuel = 10
consumo = 1
tanque_negro = pygame.Rect(10, 10, 10, 100)
tanque_negro_color = (0, 0, 0)
lleno = pygame.Rect(10, 10, 10, 100 - fuel / 10)
lleno_color = (0, 255, 0)

# Nave

tamanyo_nave = 15
x = anchura_paisaje / 2
y = altura_paisaje - 350
vy = 0
vx = 0
nave = pygame.Rect(x, y, tamanyo_nave, tamanyo_nave)
nave_color = (0, 255, 0)

# Plataforma

px = anchura_paisaje / 2
py = 395
vpx = 2
anchura_plataforma = 60
altura_plataforma = 5
plataforma = pygame.Rect(px, py, anchura_plataforma, altura_plataforma)
plataforma_color = (255, 0, 0)

# Simulación

while True:
   
   # Con esto vamos a controlar los eventos del juego.
   
   for event in pygame.event.get():
      
      if event.type == pygame.QUIT:
         sys.exit(0)
         
      elif event.type == pygame.KEYDOWN:
         if event.key == pygame.K_UP and fuel > 0:
            vy = -5
            fuel -= consumo
         if event.key == pygame.K_DOWN and fuel > 0:
            vy = +2
            fuel -= consumo
         if event.key == pygame.K_LEFT and fuel > 0:
            vx = -5
            fuel -= consumo
         if event.key == pygame.K_RIGHT and fuel > 0:
            vx = +5
            fuel -= consumo
   
   # Ahora pintemos el fondo de la pantalla
   background_color = (255, 255, 255)
   screen.fill(background_color)
   
   # Ahora rellenaremos la nave, la plataforma y otros objetos
   # de un color.
   screen.fill(nave_color, nave)
   screen.fill(plataforma_color, plataforma)
   screen.fill(tanque_negro_color, tanque_negro)
   screen.fill(lleno_color, lleno)
   
   #Creemos la sensación de movimiento de la nave y la plataforma.
   vy += g
   y += vy
   if vx < 0:
      vx += 0.1
   if vx > 0:
      vx -= 0.1
   x + vx
   px += vpx
   if px <= 0 or px >= anchura_paisaje - anchura_plataforma:
      vpx = -vpx
   nave.move_ip(vx, vy)
   plataforma.move_ip(vpx, 0)
   
   # Si la nave llega a algún límite detiene el movimiento.
   
   if nave.bottom > altura_paisaje:
      nave.bottom = altura_paisaje
      vy = 0
      
   if nave.top < 0:
      nave.top = 0
      vy = 0
   # Si la nave sale por un lado, emtra por el otro.
   
   if nave.left < 0:
      nave.left = 384
      
   if nave.right > 400:
      nave.right = 16
      
   # Redibujaremos el combustible restante.
   viejo_lleno = lleno
   lleno = pygame.Rect(10, 10, 10, 100 - fuel / 10)
   screen.fill(lleno_color, lleno)
   
   # Muestra los cambios en pantalla y espera.
   pygame.display.flip()
   pygame.time.delay(10)

Mi duda es la siguiente:
Donde pone lo de redibujar el combustible restante, todavía que da una línea para que funcione.
Código: Seleccionar todo
# Redibujaremos el combustible restante.
   viejo_lleno = lleno
   lleno = pygame.Rect(10, 10, 10, 100 - fuel / 10)
   screen.fill(lleno_color, lleno)

despues de lleno = pygame.Rect... y antes de screen.fill... tengo que poner algo que borre viejo_lleno, en PythonG sería así:
Código: Seleccionar todo
erase(viejo_lleno)

No se como sería en Pygame. gracias por sus sugerencias.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: No se usar las clases

Notapor endaramiz » Jue Ene 01, 2009 7:12 pm

RAGPacho escribió:Mi duda es la siguiente:
Donde pone lo de redibujar el combustible restante, todavía que da una línea para que funcione.
Código: Seleccionar todo
# Redibujaremos el combustible restante.
   viejo_lleno = lleno
   lleno = pygame.Rect(10, 10, 10, 100 - fuel / 10)
   screen.fill(lleno_color, lleno)

despues de lleno = pygame.Rect... y antes de screen.fill... tengo que poner algo que borre viejo_lleno, en PythonG sería así:
Código: Seleccionar todo
erase(viejo_lleno)

No se como sería en Pygame. gracias por sus sugerencias.

Hola. Dentro del bucle haces:
Código: Seleccionar todo
    # Ahora pintemos el fondo de la pantalla
   background_color = (255, 255, 255)
   screen.fill(background_color)

Por lo tanto, ya se borra todo, no hace falta utilizar ningún "erase". Aunque es una técnica fácil y eficaz para optimizar (si en estos momentos estás interesado en el tema, puedes abrir una nueva discusión. Si es que no se ha comentado ya).
Yo no consigo entender una linea:
Código: Seleccionar todo
   lleno = pygame.Rect(10, 10, 10, 100 - fuel / 10)

Y creo que el error puede estar aquí. Ya que, a mi parecer, funciona mejor si se sustituye la división por una multiplicación.
Código: Seleccionar todo
   lleno = pygame.Rect(10, 10, 10, 100 - fuel * 10)


Saludos y ánimo que tiene buena pinta.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Cierto, gracias

Notapor algarafa » Dom Ene 04, 2009 12:54 pm

Muchas gracias, es cierto, el fallo estaba ahí. Voy a depurar un poco el código, añadirle unas cuantas funcionalidades y cunado ya lo tengo mejorada abro otro topic en la sección videojuegos, porque esto ya se parece más a un juego que a la animación de un cuadrado.
Gracias de nuevo. :wink:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron