viernes, 9 de diciembre de 2011

Mover una imagen con mouse o teclado - Python (Pygame)

Desde hace poco empece con mis estudios en python, y debo decir que es un lenguaje muy cómodo de manejar y fácil de aprender, navegando por ahí encontré un conjunto de módulos python para la creación de videojuegos en 2D que me llamo mucho la atención y empece a investigar. Pygame funciona como interfaz de las bibliotecas SDL, y está orientado al manejo de sprites; realmente se pueden desarrollar videojuegos rápidamente con Pygame así que decidí hacer algunos post sobre ello.

Lo primero es instalar Pygame, en la pagina oficial http://pygame.org/download.shtml descarga la version para tu sistema operativo, si tienes un SO basado en Unix que no aparece en la lista, descarga el source e instalalo manualmente como se muestra continuación:
Abre una terminal como root y ubícate en el directorio donde descargaste pygame y luego ejecuta los siguientes comandos:
# tar -xzvf pygame-1.9.1release.tar.gz
# cd pygame-1.9.1release
# ./configure
# make
# make install

o en debian/ubuntu pueden usar : $ sudo apt-get install python-pygame 

Teniendo Pygame instalado, comencemos con un ejemplo sencillo donde subimos una imagen y la movemos con el teclado:

import pygame

def main():
    pygame.init() #carga los modulos de pygame
    screen = pygame.display.set_mode([640,480])
    imagen = pygame.image.load("balon.png")
    x,y = 0,0 #coordenadas de la imagen
    vx, vy = 0,0 #velocidad en x - y
    arriba, abajo, izq, der = False, False, False, False
    exit = False
    reloj = pygame.time.Clock()
    azul = (0,0,255)


    while exit!= True:  #ciclo principal
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    arriba = True
                    vy=-10
                if event.key == pygame.K_DOWN:
                    abajo = True
                    vy=10
                if event.key == pygame.K_RIGHT:
                    der = True
                    vx=10
                if event.key == pygame.K_LEFT:
                    izq = True
                    vx=-10
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    arriba = False
                    vy=0
                if event.key == pygame.K_DOWN:
                    abajo = False
                    vy=0
                if event.key == pygame.K_RIGHT:
                    der = False
                    vx=0
                if event.key == pygame.K_LEFT:
                    izq = False
                    vx=0               
        x+=vx
        y+=vy            
        screen.fill(azul)
        screen.blit(imagen,(x,y))        
        pygame.display.update() 
        reloj.tick(20)       
    pygame.quit()
   
main()  

Explicare un poco el cogido: pygame trabaja con superficies, es decir, con capas donde pintaremos nuestros gráficos, entonces es necesario crear la superficie principal (la ventana) con el método set_mode(resolucion) que recibe como parámetro una lista con la resolución deseada.

De la misma manera, el metodo load(archivoDeImagen) nos devuelve una superficie a partir de un archivo que se pasa como parametro, esta superficie es la imagen balón que mas moveremos con el teclado y el mouse.
La variable "azul" define un color RGB que usaremos para pintar el fondo de dicho color con el método fill(color). La variable "reloj" es un objeto especial en pygame que nos ayuda a fijar un delay en la ejecución del juego, con el método tick(FPS) asignamos los fotogramas por segundo que deseamos.

por ultimo, el método blit(imagen,coordenadas) pinta sobre la superficie, otra superficie las coordenadas deseadas, en este caso en la pantalla(screen) pinta la imagen del balón en las coordenadas x-y.

El resto del código son instrucciones que modificar la posición de la imagen en los ejes dependiendo de los eventos presentados, estos eventos se recorren con la instrucción for event in pygame.event.get(): y verifica que tipo de evento ocurrió para luego aplicar la lógica de los movimientos y el evento de tipo pygame.QUIT indica que el usuario ha hecho click en la "x" para salir.



Si quisiéramos mover la imagen con el mouse es mas sencillo, solo deben borrar (o comentar) las lineas del control del teclado (lineas 16-46), los booleanos (linea 9) y el dibujado (linea 48) y agregar esta linea después de pintar el fondo:
screen.blit(imagen,pygame.mouse.get_pos())

Por último, los invito a repasar la documentación de Pygame que esta muy interesante clickAca.

Fuentes: Wikipedia, ChelinTutorials

2 comentarios:

  1. wao tio!!!...eres grande!!!....me ayudaste en mi examen eres lo mejor..sigue asi....espero y me puedas ayudar mas adelante!!...sos un capo!!!

    ResponderEliminar
  2. ketuanya tersebut berbisnis di luar negeri, perkembangan polo di Indonesia benar-benar berhenti tahun 2002. 바카라사이트

    ResponderEliminar