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


9 Comments on “Rápido Sketching de programas en Pygame”

  1. 1 Manu said at 11:34 pm on September 28th, 2009:

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

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

    gracias!
    Manu

  2. 2 eordano said at 12:28 am on September 29th, 2009:

    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/

  3. 3 Rápido Sketching de programas en Pygame II | estebanordano.com.ar said at 7:53 pm on December 4th, 2009:

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

  4. 4 masterLoki said at 2:32 am on December 10th, 2009:

    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()

  5. 5 pablo said at 12:53 pm on December 10th, 2009:

    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.

  6. 6 tornillo said at 3:35 pm on December 10th, 2009:

    La carga de procesador es exagerada

  7. 7 eordano said at 8:08 pm on December 12th, 2009:

    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.

  8. 8 Alejandro J. Cura said at 6:51 am on February 8th, 2010:

    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

  9. 9 eordano said at 11:37 am on February 11th, 2010:

    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())?


Leave a Reply