Buscar..


Sintaxis

  • pygame.draw.rect (Superficie, color, Rect, ancho = 0)
  • pygame.draw.polygon (Superficie, color, lista de puntos, ancho = 0)
  • pygame.draw.circle (Superficie, color, pos, radio, ancho = 0)
  • pygame.draw.ellipse (Superficie, color, Rect, ancho = 0)
  • pygame.draw.arc (Superficie, color, Rect, start_angle, stop_angle, width = 1)
  • pygame.draw.line (Surface, color, start_pos, end_pos, width = 1)
  • pygame.draw.lines (Superficie, color, cerrado, lista de puntos, ancho = 1)
  • pygame.draw.aaline (Surface, color, startpos, endpos, blend = 1)
  • pygame.draw.aalines (Surface, color, closed, pointlist, blend = 1)

Parámetros

Parámetros Detalles
Superficie La superficie para dibujar la forma.
color Una secuencia de 3 o 4 enteros que representan rojo, verde y azul (y alfa), cada valor oscila entre 0-255.
Rect Un área rectangular donde se dibujará la forma.
anchura El ancho de las líneas. La forma se rellenará si ancho = 0.
lista de puntos Una lista de una cantidad arbitraria de puntos / vértices, en píxeles (x, y).
pos La posición del centro del círculo, en píxeles (x, y).
radio El radio de los círculos en píxeles.
cerrado Si es verdadero, se dibujará una línea entre el último y el primer punto, cerrando la forma.
mezcla = 1 Si es verdadero, los tonos se mezclarán con los tonos de píxeles existentes en lugar de sobrescribirlos.
ángulo inicial El ángulo inicial del arco, en radianes.
stop_angle El ángulo final del arco, en radianes.
start_pos La posición inicial de la línea, en píxeles.
end_pos La posición final de la línea, en píxeles.

Dibujando con el módulo de dibujo.

Pygame tiene un módulo, pygame.draw , que contiene funciones que pueden dibujar formas directamente en una superficie.

Función Descripción
pygame.draw.rect dibujar una forma de rectángulo
pygame.draw.polygon Dibuja una forma con cualquier número de lados.
pygame.draw.circle dibujar un círculo alrededor de un punto
pygame.draw.ellipse dibujar una forma redonda dentro de un rectángulo
pygame.draw.arc dibujar una sección parcial de una elipse
pygame.draw.line dibujar un segmento de línea recta
pygame.draw.lines dibujar múltiples segmentos de línea contiguos
pygame.draw.aaline dibujar líneas finas antialias
pygame.draw.aalines dibujar una secuencia conectada de lineas antialias

Cómo utilizar el módulo

Para usar el módulo, primero debe importar e inicializar pygame correctamente y configurar un modo para la pantalla. Es conveniente definir de antemano las constantes de color, haciendo que su código sea más legible y hermoso. Todas las funciones toman una superficie para dibujar, un color y un argumento de posición que es un Recto de pygame o una secuencia de entero / flotante de 2 elementos (el pygame.draw.circle solo tomará enteros debido a razones indefinidas).

Ejemplo

El código a continuación mostrará todas las diferentes funciones, cómo se usan y cómo se ven. Inicializaremos pygame y definiremos algunas constantes antes de los ejemplos.

import pygame
from math import pi
pygame.init()

screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0) 

El color negro es el color predeterminado de la superficie y representa la parte de la superficie sobre la que no se ha dibujado. Los parámetros de cada función se explican a continuación en Parámetros .

Rect

size = (50, 50)

rect_border = pygame.Surface(size)  # Create a Surface to draw on.
pygame.draw.rect(rect_border, RED, rect_border.get_rect(), 10)  # Draw on it.

rect_filled = pygame.Surface(size)
pygame.draw.rect(rect_filled, RED, rect_filled.get_rect())   

introduzca la descripción de la imagen aquí

Polígono

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]  # The corner points of the polygon.

polygon = pygame.Surface(size)
pygame.draw.polygon(polygon, RED, points, 10)

polygon_filled = pygame.Surface(size)
pygame.draw.polygon(polygon_filled, RED, points)

introduzca la descripción de la imagen aquí

Circulo

size = (50, 50)
radius = 25

circle = pygame.Surface(size)
pygame.draw.circle(circle, RED, (radius, radius), radius, 10)  # Position is the center of the circle.

circle_filled = pygame.Surface(size)
pygame.draw.circle(circle_filled, RED, (radius, radius), radius)

Los agujeros son una consecuencia desafortunada del algoritmo de dibujo de pygame.

introduzca la descripción de la imagen aquí

Elipse

size = (50, 25)  # Minimize it's height so it doesn't look like a circle.

ellipse = pygame.Surface(size)  
pygame.draw.ellipse(ellipse, RED, ellipse.get_rect(), 5)

ellipse_filled = pygame.Surface(size)
pygame.draw.ellipse(ellipse_filled, RED, ellipse.get_rect())

Los agujeros son una consecuencia desafortunada del algoritmo de dibujo de pygame.

introduzca la descripción de la imagen aquí

Arco

size = (50, 50)

arc = pygame.Surface(size)
pygame.draw.arc(arc, RED, arc.get_rect(), 0, pi)  # 0 to pi is 180° creating a half circle.

introduzca la descripción de la imagen aquí

Línea

size = (50, 50)

line = pygame.Surface(size)
pygame.draw.line(line, RED, (0, 0), (50, 50))  # Start at topleft and ends at bottomright.

introduzca la descripción de la imagen aquí

Líneas

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]

lines = pygame.Surface(size)
pygame.draw.lines(lines, RED, False, points)

lines_closed = pygame.Surface(size)
pygame.draw.lines(lines_closed, RED, True, points)

introduzca la descripción de la imagen aquí

Línea de antialias

size = (50, 50)

antialiased_line = pygame.Surface(size)
pygame.draw.aaline(antialiased_line, RED, (0, 0), (50, 50))

introduzca la descripción de la imagen aquí

Líneas suavizadas

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]

antialiased_lines = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines, RED, False, points)

antialiased_lines_closed = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines_closed, RED, True, points)

introduzca la descripción de la imagen aquí

Pruébalo

Para probarlo por ti mismo: copie uno de los fragmentos de código de arriba y el código de abajo en un archivo vacío, cambie la imagen del nombre al nombre de la superficie que desea mezclar y experimentar.

import pygame
from math import pi
pygame.init()

screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0) 

# But code snippet here

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
    
    screen.blit(image, (25, 25))
    pygame.display.update()

Superficies

En pygame, usualmente utilizas Superficies para representar la apariencia de los objetos, y Rectángulos para representar sus posiciones. Una superficie es como una hoja de papel en blanco que contiene colores o imágenes. Hay dos formas de crear una superficie: en blanco desde cero o cargando una imagen.

Crear una superficie

Para crear una superficie, necesita un tamaño mínimo, que es una secuencia entera de ancho y alto de 2 elementos, que representa el tamaño en píxeles.

También puede pasar argumentos adicionales al crear una Superficie para controlar la profundidad de bits, máscaras y funciones adicionales como alfa por píxel y / o crear la imagen en la memoria de video. Esto está fuera del alcance de este ejemplo sin embargo.

size = width, height = (32, 32)
empty_surface = pygame.Surface(size)

Puede usar el módulo pygame.draw para dibujar formas en la superficie, o rellénelo con un color llamando al método de fill(color) la superficie fill(color) . El color del argumento es una secuencia de enteros de 3 o 4 elementos o un objeto pygame.Color .

Cargar una imagen

La mayoría de las veces, le gustaría usar sus propias imágenes en un juego (llamadas sprites). Crear una superficie con tu imagen es tan fácil como:

my_image = pygame.image.load(path_to_image)

El camino a la imagen puede ser relativo o absoluto. Para mejorar el rendimiento, generalmente es aconsejable convertir su imagen al mismo formato de píxeles que la pantalla. Esto se puede hacer llamando al método de Surface convert() , así:

my_image = pygame.image.load(path_to_image).convert()

Si su imagen contiene transparencias (valores alfa) simplemente llame al método convert_alpha() lugar:

my_image = pygame.image.load(path_to_image).convert_alpha()

Blitting

Las superficies deben estar marcadas en la pantalla para poder mostrarlas. Fundir esencialmente significa copiar píxeles de una superficie a otra (la pantalla también es una superficie). También debe pasar la posición de la superficie, que debe ser una secuencia de enteros de 2 elementos o un objeto Rect. El tope de la superficie se colocará en la posición.

screen.blit(my_image, (0, 0))
pygame.display.update()  # or pygame.display.flip()

Es posible hacer blit a otras superficies que no sean la pantalla. Para mostrar lo que se ha borrado en la pantalla, debe llamar a pygame.display.update() o pygame.display.flip() .

Transparencia

Hay tipos 3 de transparencia admitidos en pygame: colorkeys, alfas de superficie y alfas de píxel.

Colorkeys

Hace que un color sea completamente transparente, o más exactamente, haciendo que un color simplemente no se vea. Si tiene una imagen con un rectángulo negro en su interior, puede establecer una combinación de colores para evitar que el color negro se vea borroso.

BLACK = (0, 0, 0)
my_image.set_colorkey(BLACK)  # Black colors will not be blit.

Una superficie solo puede tener un colorkey. Configurar otro colorkey sobrescribirá el anterior. Colorkeys no puede tener valores alfa diferentes, solo puede hacer que un color no sea visible.

introduzca la descripción de la imagen aquí

Alfas de superficie

Hace que toda la superficie sea transparente por un valor alfa. Con este método, puede tener diferentes valores alfa, pero afectará a toda la superficie.

my_image.set_alpha(100)  # 0 is fully transparent and 255 fully opaque.

introduzca la descripción de la imagen aquí

Alfa por píxel

Hace que cada píxel de la superficie sea transparente por un valor alfa individual. Esto te da la mayor libertad y flexibilidad, pero también es el método más lento. Este método también requiere que la Superficie se cree como una Superficie alfa por píxel, y los argumentos de color deben contener un cuarto entero alfa.

size = width, height = (32, 32)
my_image = pygame.Surface(size, pygame.SRCALPHA)  # Creates an empty per-pixel alpha Surface.

La superficie ahora dibujará transparencia si el color contiene el cuarto valor alfa.

BLUE = (0, 0, 255, 255)
pygame.draw.rect(my_image, BLUE, my_image.get_rect(), 10)

A diferencia de las otras Superficies, este color predeterminado de la Superficie no será negro sino transparente. Es por eso que el rectángulo negro en el medio desaparece.

introduzca la descripción de la imagen aquí

Combina colorkey y superficie alfa

Los alfas de Colorkey y Superficie pueden combinarse, pero no el alfa por píxel. Esto puede ser útil si no desea el rendimiento más lento de una superficie por píxel.

purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

introduzca la descripción de la imagen aquí

Codigo completo

Copie esto en un archivo vacío y ejecútelo. Presione las teclas 1, 2, 3 o 4 para que aparezcan las imágenes. Presione 2, 3 o 4 varias veces para hacerlos más opacos.

import pygame
pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255, 50)  # This color contains an extra integer. It's the alpha value.
PURPLE = (255, 0, 255)

screen = pygame.display.set_mode((200, 325))
screen.fill(WHITE)  # Make the background white. Remember that the screen is a Surface!
clock = pygame.time.Clock()

size = (50, 50)
red_image = pygame.Surface(size)
green_image = pygame.Surface(size)
blue_image = pygame.Surface(size, pygame.SRCALPHA)  # Contains a flag telling pygame that the Surface is per-pixel alpha
purple_image = pygame.Surface(size)

red_image.set_colorkey(BLACK)
green_image.set_alpha(50)
# For the 'blue_image' it's the alpha value of the color that's been drawn to each pixel that determines transparency.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

pygame.draw.rect(red_image, RED, red_image.get_rect(), 10)
pygame.draw.rect(green_image, GREEN, green_image.get_rect(), 10)
pygame.draw.rect(blue_image, BLUE, blue_image.get_rect(), 10)
pygame.draw.rect(purple_image, PURPLE, purple_image.get_rect(), 10)

while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                screen.blit(red_image, (75, 25))
            elif event.key == pygame.K_2:
                screen.blit(green_image, (75, 100))
            elif event.key == pygame.K_3:
                screen.blit(blue_image, (75, 175))
            elif event.key == pygame.K_4:
                screen.blit(purple_image, (75, 250))

    pygame.display.update()


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow