Menu
CoddyTech

Chuleta de pygame

Última actualización

Configuración y bucle del juego

Todo programa de pygame abre una ventana y luego repite un bucle hasta que el jugador sale.

OperaciónCódigo
Instalar pygame-cepython3 -m pip install pygame-ce
Importar e iniciar pygameimport pygame pygame.init()
Abrir una ventanascreen = pygame.display.set_mode((640, 480))
Poner el título de la ventanapygame.display.set_caption("My Game")
Crear un relojclock = pygame.time.Clock()
El bucle del juegorunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
Cerrar pygame al salir del buclepygame.quit()

Pantalla

La pantalla es una Surface; no se ve nada hasta que llamas a flip.

OperaciónCódigo
Mostrar el fotograma terminadopygame.display.flip()
Mostrar solo algunas zonaspygame.display.update([rect1, rect2])
Limpiar la pantallascreen.fill((30, 30, 46))
Tamaño de la ventanascreen.get_size(), screen.get_width()
La pantalla como Rectscreen.get_rect()
Ventana redimensionablepygame.display.set_mode((640, 480), pygame.RESIZABLE)
Pantalla completa al tamaño del escritoriopygame.display.set_mode((0, 0), pygame.FULLSCREEN)

Colores y dibujo

Las funciones de pygame.draw reciben una superficie, un color y una posición. width=0 rellena.

OperaciónCódigo
Color en RGB(255, 140, 0)
Color por nombre o hexadecimal"tomato", "#ff8c00", pygame.Color("gold")
Rectángulopygame.draw.rect(screen, "red", (x, y, w, h))
Borde y esquinas redondeadaspygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Círculo (por su centro)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Líneapygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Polígonopygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Elipse dentro de una cajapygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Un Rect guarda una posición y un tamaño como números enteros.

OperaciónCódigo
Crear un Rectplayer = pygame.Rect(x, y, width, height)
Colocar por cualquier puntoplayer.center = (320, 240), player.bottom = 400
Bordes y esquinasleft, right, top, bottom, topleft, midbottom
Mover en el sitioplayer.move_ip(dx, dy)
Copia movidamoved = player.move(dx, dy)
Mantener dentro de la pantallaplayer.clamp_ip(screen.get_rect())
Agrandar alrededor del centrobigger = player.inflate(20, 20)
Posiciones con decimales (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

Imágenes, Surfaces y blit

Carga las imágenes una vez, antes del bucle, y luego haz blit de ellas en cada fotograma.

OperaciónCódigo
Cargar una imagen con transparenciaimg = pygame.image.load("player.png").convert_alpha()
Cargar una imagen opacabg = pygame.image.load("sky.png").convert()
Dibujar una imagenscreen.blit(img, (x, y))
Dibujar centradascreen.blit(img, img.get_rect(center=(320, 240)))
Nueva Surface vacíapanel = pygame.Surface((200, 100))
Surface transparentelayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Atenuar una Surface enteraimg.set_alpha(128)
Recortar un fotograma de una hoja de spritesframe = sheet.subsurface((0, 0, 32, 32))
Guardar una captura de pantallapygame.image.save(screen, "shot.png")

Transformaciones

Cada función devuelve una Surface nueva; transforma el original, no el último resultado.

OperaciónCódigo
Redimensionarpygame.transform.scale(img, (64, 64))
Escalar por un factorpygame.transform.scale_by(img, 2)
Redimensionar con suavizadopygame.transform.smoothscale(img, (64, 64))
Rotar (antihorario, en grados)pygame.transform.rotate(img, 45)
Rotar alrededor del centrorotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Reflejar en horizontalpygame.transform.flip(img, True, False)

Eventos y teclado

Usa eventos para pulsaciones sueltas y get_pressed() para teclas mantenidas.

OperaciónCódigo
Leer los eventos de este fotogramafor event in pygame.event.get():
Ventana cerradaevent.type == pygame.QUIT
Se pulsó una teclaevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Se soltó una teclaevent.type == pygame.KEYUP
Carácter escritoevent.unicode
Teclas mantenidas ahorakeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
Dirección con dos teclasdx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
Teclas pulsadas en este fotograma (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
Constantes de teclasK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Nombre de una teclapygame.key.name(event.key)
Evento propioHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Ratón

Botones: 1 izquierdo, 2 central, 3 derecho.

OperaciónCódigo
Se pulsó un botónevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Dónde se pulsóevent.pos
Posición actual del punterox, y = pygame.mouse.get_pos()
Botones mantenidos ahoraleft, middle, right = pygame.mouse.get_pressed()
El ratón se movióevent.type == pygame.MOUSEMOTION, event.rel
Se giró la ruedaevent.type == pygame.MOUSEWHEEL, event.y
Clic dentro de un botónbutton_rect.collidepoint(event.pos)
Ocultar el punteropygame.mouse.set_visible(False)

Sprites y grupos

Un sprite guarda una image y un rect; un grupo actualiza y dibuja muchos.

OperaciónCódigo
Clase de spriteclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Crear un grupocoins = pygame.sprite.Group()
Añadir a un grupocoins.add(Coin((100, 50)))
Actualizar todos los spritescoins.update()
Dibujar todos los spritescoins.draw(screen)
Quitar un sprite de todos los gruposcoin.kill()
Grupo con un solo spriteplayer = pygame.sprite.GroupSingle(Player())

Colisiones

Dos Rect chocan cuando se solapan; tocarse solo por los bordes no cuenta.

OperaciónCódigo
Dos rectángulosa.colliderect(b)
Punto dentrorect.collidepoint(x, y)
El primero de variosrect.collidelist(walls) # index or -1
Sprite contra un grupohits = pygame.sprite.spritecollide(player, coins, True)
Cualquier choquepygame.sprite.spritecollideany(player, enemies)
Grupo contra grupopygame.sprite.groupcollide(bullets, enemies, True, True)
Al píxelpygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Círculospygame.Vector2(a).distance_to(b) < r1 + r2

Texto y fuentes

Renderiza el texto en una Surface y luego haz blit.

OperaciónCódigo
Fuente por defectofont = pygame.font.Font(None, 36)
Fuente del sistemafont = pygame.font.SysFont("arial", 24)
Archivo de fuentefont = pygame.font.Font("pixel.ttf", 32)
Renderizar textotext = font.render("Score: 10", True, "white")
Dibujarlo centradoscreen.blit(text, text.get_rect(center=(320, 40)))
Ajustar texto largo (pygame-ce)font.render(story, True, "white", None, 400)
Tamaño sin renderizarfont.size("Hello")
Fuentes instaladaspygame.font.get_fonts()

Sonido y música

Carga los sonidos una vez. La música reproduce una pista en streaming desde su archivo.

OperaciónCódigo
Cargar un sonidojump = pygame.mixer.Sound("jump.ogg")
Reproducirlojump.play()
Volumen del sonidojump.set_volume(0.5)
Cargar músicapygame.mixer.music.load("theme.ogg")
Repetir la música sin finpygame.mixer.music.play(-1)
Pausar y reanudarpygame.mixer.music.pause(), pygame.mixer.music.unpause()
Parar la músicapygame.mixer.music.stop()

Tiempo y temporizadores

Los ticks se miden en milisegundos.

OperaciónCódigo
Limitar los fotogramas por segundoclock.tick(60)
Delta time en segundosdt = clock.tick(60) / 1000
Fotogramas por segundo actualesclock.get_fps()
Milisegundos desde initpygame.time.get_ticks()
Evento de temporizador que se repiteSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Temporizador de una sola vezpygame.time.set_timer(SPAWN, 2000, loops=1)
Parar un temporizadorpygame.time.set_timer(SPAWN, 0)

Vector2

Decimales para posiciones y velocidades.

OperaciónCódigo
Crear un vectorpos = pygame.Vector2(100, 200)
Mover según una velocidadpos += velocity * dt
Longitudvelocity.length()
Misma velocidad en diagonalif direction.length() > 0: direction = direction.normalize()
Distancia entre puntospos.distance_to(target)
Rotarvelocity.rotate(90)
Avanzar hacia un punto (pygame-ce)pos.move_towards_ip(target, 5)

El código de pygame que necesitas al hacer un juego 2D en Python, agrupado por tarea: el bucle del juego, la pantalla, los colores y el dibujo, Rect, las imágenes y blit, escalar y rotar, la entrada de teclado y ratón, los sprites y los grupos, las colisiones, el texto, el sonido, los temporizadores y Vector2. Cada fila es un fragmento corto para pegar, junto a lo que hace.

Todo aquí está escrito para pygame-ce 2.5, la edición comunitaria de pygame, que se sigue importando con import pygame. Las filas marcadas con pygame-ce usan sus novedades; el resto también funciona en el pygame original. Prueba cualquier fragmento en el playground de pygame, que ejecuta pygame en tu navegador sin instalar nada. ¿Eres nuevo en Python? Empieza por la chuleta de Python.

Preguntas frecuentes sobre la chuleta de pygame

¿Esta chuleta de pygame es gratis?

Sí. Es gratis y no hace falta registrarse. Guárdala en marcadores, o imprímela en PDF desde el navegador, y vuelve cuando necesites la llamada exacta para un grupo de sprites, un sonido o una comprobación de colisión.

¿Esta chuleta sirve para pygame y pygame-ce?
Sí. Los dos se importan con import pygame y comparten casi toda la API. Las filas marcadas con pygame-ce (FRect, scale_by, get_just_pressed, el ajuste de texto y move_towards_ip) necesitan pygame-ce, y todo lo demás funciona en cualquiera de los dos.
¿Por qué mi ventana de pygame no responde?
El bucle del juego no está leyendo los eventos. Llama a pygame.event.get() una vez en cada fotograma, aunque ignores los eventos, y termina cada fotograma con pygame.display.flip() y clock.tick(60).
¿Uso eventos o key.get_pressed() para la entrada?
Usa un evento KEYDOWN para acciones que ocurren una vez por pulsación, como saltar o abrir un menú. Usa pygame.key.get_pressed() para acciones que duran mientras se mantiene una tecla, como caminar.
Ilustración de los lenguajes de programación de Coddy

Aprende Pygame con Coddy

Comenzar