HOWTO · Pygame
Función surface.blit() en Pygame
Aprenda cómo Surface.blit() copia píxeles entre superficies de Pygame, posiciona el resultado y selecciona un área de origen.
En esta página
Surface.blit() copia píxeles desde una Surface de origen a una Surface de destino. En una pantalla de Pygame, la pantalla es la superficie de destino; también puede dibujar en una superficie fuera de pantalla y luego colocar ese resultado en la pantalla. Los ejemplos cortos de operación a continuación explican los argumentos, mientras que la sección final los integra en una ventana completa con un bucle de eventos.
Estos ejemplos se centran en copiar y posicionar píxeles. No demuestran la mezcla (blending). Para ver las instrucciones de configuración, consulte el ejemplo básico de ventana de Pygame; los ejemplos aquí se centran en dibujar entre superficies en lugar de crear una ventana.
Cómo Surface.blit() dibuja una superficie sobre otra
Llame a blit() sobre la superficie que recibirá los píxeles. Su primer argumento es la superficie de origen y su segundo argumento indica la posición de destino: la esquina superior izquierda donde se dibuja el origen. Por ejemplo, destination.blit(source, (20, 30)) coloca el origen en la coordenada x 20 y la coordenada y 30 del destino. Una tupla de dos elementos es una forma clara de expresar esa posición.
El método también acepta un área de origen opcional y un valor de banderas especiales. El área de origen es un rectángulo medido desde la esquina superior izquierda de la superficie de origen; selecciona qué porción se copiará. Si lo omite, se utiliza toda la superficie de origen. Las banderas especiales seleccionan una operación de blit de Pygame, como una operación de mezcla. Son independientes de los argumentos de posición de destino y área de origen, y el ejemplo aquí las deja en su valor predeterminado.
La forma de la llamada es destination.blit(source, destination_position, source_area=None, special_flags=0). El método blit() devuelve un rectángulo que describe el área afectada en el destino, lo que puede ser útil al actualizar solo una parte de una pantalla. Una posición de destino fuera de la superficie de destino puede hacer que solo se dibuje la porción superpuesta.
Usar Surface.blit() con un área de origen
Cree superficies con pygame.Surface((width, height)) y luego rellénelas con una tupla de color RGB como (200, 100, 100). Para copiar un área de origen seleccionada, pase un rectángulo en la forma (x, y, width, height) como tercer argumento. Por ejemplo, (0, 0, 10, 5) selecciona un rectángulo de 10 por 5 que comienza en la esquina superior izquierda del origen. Los píxeles copiados comienzan en la posición de destino que pase como segundo argumento.
Después de dibujar en una superficie fuera de pantalla, dibuje esa superficie en la pantalla dentro del bucle de eventos. Borre o vuelva a dibujar la pantalla en cada fotograma antes de llamar a pygame.display.flip(); de lo contrario, el contenido de fotogramas anteriores puede permanecer visible. La ilustración muestra la idea de copiar una región de origen en otra superficie.
Ejecutar un ejemplo completo de Pygame
El siguiente programa crea una ventana, rellena dos superficies, copia una región seleccionada de una a la otra y dibuja el resultado durante 60 fotogramas antes de cerrarse. Inicializa solo el subsistema de visualización porque este ejemplo no utiliza audio. Instale Pygame en el entorno de Python que utilice para ejecutarlo. Para una ventana que permanezca abierta hasta que la cierre, reemplace range(60) por while running. La ejecución proporcionada imprimió los mensajes de inicio de Pygame y la confirmación de copia que se muestra a continuación.
import sys
import warnings
warnings.filterwarnings(
"ignore",
message="Your system is avx2 capable but pygame was not built with support for it.*",
category=RuntimeWarning,
)
import pygame
pygame.display.init()
screen = pygame.display.set_mode((640, 480), pygame.RESIZABLE)
pygame.display.set_caption("Surface.blit() example")
clock = pygame.time.Clock()
destination = pygame.Surface((100, 100))
destination.fill((200, 100, 100))
source = pygame.Surface((30, 30))
source.fill((100, 200, 100))
# Copy a 10-by-5 region from source to destination at (10, 10).
destination.blit(source, (10, 10), (0, 0, 10, 5))
print("Copied a 10-by-5 source area to (10, 10).")
running = True
for _ in range(60):
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if not running:
break
screen.fill((20, 20, 20))
screen.blit(destination, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
pygame 2.6.1 (SDL 2.26.5, Python 3.14.7)
Hello from the pygame community. https://www.pygame.org/contribute.html
Copied a 10-by-5 source area to (10, 10).