Rápido Sketching de programas en Pygame
Fecha: September 28th, 2009 | Categoría: Python | 9 Comments »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.
-
import pygame
Y con eso empieza la magia.
-
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.
-
cuadraditos = [ ]
-
x, y = 0,0
Un par de inicialización de variables.
-
while True:
-
for evento in pygame.event.get():
-
if evento.type == pygame.MOUSEMOTION:
-
x, y = evento.pos
-
if evento.type == pygame.MOUSEBUTTONDOWN:
-
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é)
-
screen.fill((0,0,0))
-
for caja in cuadrados:
-
color = (randint(0,255), randint(0,255), randint(0,255))
-
pygame.draw.rect(screen, color, (caja, (10,10)))
-
pygame.draw.rect(screen, (255,255,255), ((x-5,y-5), (10,10)))
-
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

esteban…
no uses pygame! usá pyglet!
otra cosa:
subí el .py, no da copiar todo
gracias!
Manu
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/
[...] Acá hay código de otros programas que sketcheé rápidamente (follow-up de este post) [...]
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()
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.
La carga de procesador es exagerada
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.
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
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())?