Rápido Sketching de programas en Pygame

Fecha: September 28th, 2009 | Categoría: Python | 9 Comments »

Follow up (parte 2)

Hoy en el recreo me aburría y empecé a escribir boludeces en la netbook de un amigo (demoré una banda por el f*cking tecladito). Pensé que estaría bueno blogear sobre esto, ya que últimamente estuve haciendo muchas de estas pavadas.

  1. import pygame

Y con eso empieza la magia.

  1. screen = pygame.display.set_mode((640,460))

Dos líneas de código y ya hay algo en la pantalla! Si usamos el intérprete, los resultados son inmediatos. Recomiendo IPython.

  1. cuadraditos = [ ]
  2. x, y = 0,0

Un par de inicialización de variables.

  1. while True:
  2.     for evento in pygame.event.get():
  3.         if evento.type == pygame.MOUSEMOTION:
  4.             x, y = evento.pos
  5.         if evento.type == pygame.MOUSEBUTTONDOWN:
  6.             cuadrados.append((x-5,y-5))

Manejamos un par de eventos. Si se mueve el ratón, actualizamos la posición del mismo en las variables x, y; Si se hace click, vamos a agregar la posición (menos 5 en cada coordenada, ya vamos a ver por qué)

  1.     screen.fill((0,0,0))
  2.     for caja in cuadrados:
  3.         color = (randint(0,255), randint(0,255), randint(0,255))
  4.         pygame.draw.rect(screen, color, (caja, (10,10)))
  5.     pygame.draw.rect(screen, (255,255,255), ((x-5,y-5), (10,10)))
  6.     pygame.display.flip()

Línea 1: Borramos lo que había antes en la pantalla.
Línea 2, 3, 4: Para cada cosa guardada en la lista, elegimos un color al azar, y dibujamos un cuadradito de ese color en la pantalla, en la posición donde lo creamos. (hice trampa y me salteé la linea "from random import randint" para que quede más impactante la velocidad, simpleza, y síntesis que tiene este código)
Línea 5: Ponemos un cuadrado blanco abajo del mouse, centrado (para eso el -5).
Línea 6: "Flippeamos" el buffer de la pantalla, para que muestre lo que vamos dibujando.

Con 3 líneas más se puede agregar que al tocar una tecla (ej: 'Escape') salga del bucle infinito... detener el programa con Ctrl+C desde la consola.

Menos de 20 líneas y el resultado es bastante lindo, para jugar durante 20 segundos y tirar este código.

Update: Código fuente para bajar: Sketch.py


  • http://www.7cerebros.com.ar Manu

    esteban...
    no uses pygame! usá pyglet! :D

    otra cosa:
    subí el .py, no da copiar todo

    gracias!
    Manu

  • http://estebanordano.com.ar/ eordano

    Ahí updateé.

    En pyglet no creo que sea distinto, tal vez un poco más largo porque hay que usar decoradores para manejar eventos, o heredar la clase ventana...

    By the way, con esta filosofía de "vamos a sentarnos frente al teclado a ver qué sale andando rápido y simple", también programé el jueguito del Go que me dijiste que estabas interesado:

    http://estebanordano.com.ar/go/

  • http://estebanordano.com.ar/programas-en-pygame-ii/ Rápido Sketching de programas en Pygame II | estebanordano.com.ar

    [...] Acá hay código de otros programas que sketcheé rápidamente (follow-up de este post) [...]

  • http://miselaneos.wordpress.com masterLoki

    Saludos, muy buen post y excelente ejemplo.
    Me da gusto saber que mas gente sana que piensa que otros lenguajes (vease C#) son las "mejores herramientas" para RAD.

    Solo un peque detalle, se te olvido poner el
    [sourcecode language='python']
    import random
    [/sourcecode]

    para usar el randint()

  • http://terli.wordpress.com pablo

    Que tan cierto que es eso. De una linea que abre las puestas a una gran magia. Muy bueno. Ahora hablando en serio. Cuesta creer que sea asi. Y uno mismo podria probarlo. Es genial lo que hicieron con pygame. Una locura.

  • tornillo

    La carga de procesador es exagerada

  • http://estebanordano.com.ar/ eordano

    Gracias por los comentarios!

    @tornillo: si, la carga de procesador es exagerada por el while(1)... igual el código es una proof of concept, no está pensado para producción ni remotamente.

  • http://protocultura.net/ Alejandro J. Cura

    Para bajar la carga del procesador, lo único que falta es crear un pygame.time.Clock fuera del while, y luego usar .tick() dentro del while. Y listo.

    Otra cosita: en vez de usar randint(0,255), creo que te convendría usar random.randrange(256), que es más "pythónico".

    saludos,
    --
    alecu

  • http://estebanordano.com.ar/ eordano

    Gracias por las sugerencias! Si, consume mucho CPU. Decís de hacer el "tick()" y después hacer un delay() hasta "el próximo frame" (calculando FPS = 1000/tick())?