
Dibujar rectángulos, círculos, elipses y polígonos
Level 7: Dibujo de formas geométricas con Pygame - Parte 1
En el capítulo anterior mostré de que forma funcionaban las líneas dibujadas en pantalla y de que forma las podías mostrar y configurar. En este, voy a mostrarte como funcionan algunas de las posibles formas geométricas que tiene Pygame, como el cuadrado, el pentágono, el círculo...
Empezamos el capítulo con el siguiente código. El de una ventana vacía y lista para dibujar en ella.
# Importamos Pygame
import pygame
# Inicializa Pygame
pygame.init()
# Configuración de la ventana de juego
ventana = pygame.display.set_mode((600, 350))
pygame.display.set_caption("Game master")
icono = pygame.image.load("gold-mine.png")
pygame.display.set_icon(icono)
# Bucle para mantener el juego en marcha
while True:
for evento in pygame.event.get():
if evento.type == pygame.QUIT:
pygame.quit()
exit()
# Actualización de la ventana de juego
pygame.display.update()
Dibujar un rectángulo en Pygame
Para dibujar un rectángulo en Pygame, tan solo debes utilizar la función que ves a continuación:
pygame.draw.rect(ventana, color, rect, width=0)
Aquí tienes el código de un rectángulo de ejemplo:
# Dibuja un rectángulo
pygame.draw.rect(ventana, (240, 55, 69), (100, 150, 200, 100))

En los argumentos pasamos primero el lugar donde queremos mostrar el rectángulo. Después, especificamos un color RGB con la primera tupla. El último argumento es una tupla con la posición (100 en X
y 150 en Y
) y el ancho (200) y alto (100).
Se puede establecer otro argumento extra. Este hará que el rectángulo quede hueco por dentro y dejará la línea lo gruesa que le especifiquemos:
pygame.draw.rect(ventana, (240, 55, 69), (100, 150, 200, 100), 7)

Los cuadrados los haremos también con esta función, ya que un rectángulo con la misma longitud en todos sus lados es sencillamente un cuadrado y deja de ser rectángulo.
pygame.draw.rect(ventana, (240, 55, 69), (100, 150, 100, 100))

Para esta función, tenemos disponibles todos estos parámetros:
def rect(
surface: Surface,
color: ColorValue,
rect: RectValue,
width: int = 0,
border_radius: int = -1,
border_top_left_radius: int = -1,
border_top_right_radius: int = -1,
border_bottom_left_radius: int = -1,
border_bottom_right_radius: int = -1,
)
surface: Surface
: Es un objeto de tipoSurface
que representa la superficie en la que se dibujará el rectángulo.color: ColorValue
: Es un valor de color (ColorValue
) que se utilizará para dibujar el rectángulo.rect: RectValue
: Es un objeto de tipoRectValue
que define la posición y dimensiones del rectángulo a dibujar.width: int = 0
: Es un parámetro opcional de tipo entero que representa el grosor de la línea del rectángulo. Si se omite o se establece en 0, el rectángulo se rellena completamente.border_radius: int = -1
: Es un parámetro opcional de tipo entero que especifica el radio de los bordes del rectángulo. Si se establece en -1 (valor predeterminado), se utilizará un borde recto.border_top_left_radius: int = -1
: Es un parámetro opcional de tipo entero que especifica el radio de la esquina superior izquierda del rectángulo. Si se establece en -1 (valor predeterminado), se utilizará el valor deborder_radius
.border_top_right_radius: int = -1
: Es un parámetro opcional de tipo entero que especifica el radio de la esquina superior derecha del rectángulo. Si se establece en -1 (valor predeterminado), se utilizará el valor deborder_radius
.border_bottom_left_radius: int = -1
: Es un parámetro opcional de tipo entero que especifica el radio de la esquina inferior izquierda del rectángulo. Si se establece en -1 (valor predeterminado), se utilizará el valor deborder_radius
.border_bottom_right_radius: int = -1
: Es un parámetro opcional de tipo entero que especifica el radio de la esquina inferior derecha del rectángulo. Si se establece en -1 (valor predeterminado), se utilizará el valor deborder_radius
.
Aquí tienes un ejemplo de uso de todos los argumentos posibles:
# Se dibuja un rectángulo
pygame.draw.rect(ventana, (255, 0, 0), (100, 100, 200, 100), 2, 10, 5, 5, 5, 50)
Si utilizas los argumentos de radius para cada borde, se anula el de radius general (border_radius).

Dibujar círculos en Pygame
Para dibujar un círculo en Pygame, tan solo debes utilizar la función que ves a continuación:
pygame.draw.circle(ventana, color, centro, radio, width=0)
Aquí tienes el código de un par de círculos de ejemplo:
# Dibuja un círculo
pygame.draw.circle(ventana, (240, 55, 69), (275, 200), 50)
# Dibuja un círculo sin relleno
pygame.draw.circle(ventana, (0, 255, 0), (100, 100), 75, 7)
Los primeros argumentos son iguales que los del cuadrado. Después de la tupla de color, tenemos una tupla para posicionar el círculo en las coordenadas del lienzo y un valor 50 que corresponde al radio del círculo (tamaño que ocupa). El último argumento opcional que tiene el segundo círculo, es que hace que no tenga relleno, igual que con el rectángulo.

Esta función tiene muchos parámetros. Aquí los tienes todos:
def circle(
surface: Surface,
color: ColorValue,
center: Coordinate,
radius: float,
width: int = 0,
draw_top_right: bool = False,
draw_top_left: bool = False,
draw_bottom_left: bool = False,
draw_bottom_right: bool = False,
)
Aquí tienes un ejemplo utilizando todos los parámetros:
# Se dibuja un círculo
pygame.draw.circle(ventana,
(255, 255, 0),
(300, 200),
50,
width=2,
draw_top_right=True,
draw_top_left=False,
draw_bottom_left=True,
draw_bottom_right=False)

Dibujar polígonos en Pygame
Los polígonos son unas de las formas más complicadas de manejar, ya que hay que definir las coordenadas de cada punto en la forma.
Para este tipo de forma, necesitamos saber muy bien lo que vamos a dibujar. Una vez lo sepamos, necesitaremos crear una lista con varias tuplas. Estas van a servir para dibujar cada línea que formará la forma. Algo parecido a lo que hicimos con el proyecto de dibujo de un cuadrado con 4 líneas.
Aquí los tienes todos los parámetros de la función:
def polygon(
surface: Surface,
color: ColorValue,
points: Sequence[Coordinate],
width: int = 0,
)
surface: Surface
: Es el objetoSurface
donde se dibujará el polígono (ventana
en nuestro caso).color: ColorValue
: Es el color del polígono.points: Sequence[Coordinate]
: Es una secuencia de coordenadas '(x, y)' que representan los puntos del polígono.width: int = 0
(opcional): Es el grosor del contorno del polígono. Si no se especifica, el valor predeterminado es 0.
Por ejemplo, si quieres dibujar un triángulo (3 lados), deberás definir 3 coordenadas de inicio y fin para cada lado. Estos puntos se unirán formando un triángulo si las medidas son correctas.
# Define los puntos para un triángulo
puntos = [(100,300), (100,100), (250,100)]
# Dibuja un polígono con los puntos definidos
pygame.draw.polygon(ventana, (240, 55, 69), puntos)

Utilizando el valor opcional width
, le pondremos un grosor de borde, dejando vacío el interior.
# Define los puntos para un triángulo
puntos = [(100,300), (100,100), (250,100)]
# Dibuja un polígono con los puntos definidos
pygame.draw.polygon(ventana, (240, 55, 69), puntos, 7)

Función ellipse de Pygame
Las elipses son formas curvas que pueden ser dibujadas utilizando la función ellipse()
de Pygame.
Para dibujar una elipse, necesitamos definir las coordenadas del rectángulo que la contiene. Este rectángulo se especifica utilizando las coordenadas de su esquina superior izquierda, junto con su ancho y altura.
Aquí tienes todos los parámetros de la función:
def ellipse(
surface: Surface,
color: ColorValue,
rect: RectValue,
width: int = 0,
)
surface: Surface
: Es el objetoSurface
donde se dibujará la elipse (por ejemplo, la ventana).color: ColorValue
: Es el color de la elipse.rect: RectValue
: Es un rectángulo que contiene la elipse. Puede ser especificado como un objetoRect
o como una tupla de dos coordenadas(x, y)
.width: int = 0
(opcional): Es el grosor del contorno de la elipse. Si no se especifica, el valor predeterminado es 0.
Por ejemplo, si deseas dibujar una elipse en un rectángulo con esquina superior izquierda en el punto (100, 100), ancho de 200 y altura de 150, puedes utilizar el siguiente código:
# Define el rectángulo para la elipse
rectangulo = pygame.Rect(100, 100, 200, 150)
# Dibuja la elipse utilizando el rectángulo definido
pygame.draw.ellipse(ventana, (0, 255, 0), rectangulo)

Utilizando el valor opcional width
, puedes especificar un grosor de borde para la elipse:
# Define el rectángulo para la elipse
rectangulo = pygame.Rect(100, 100, 200, 150)
# Dibuja la elipse utilizando el rectángulo definido con un grosor de borde
pygame.draw.ellipse(ventana, (0, 255, 0), rectangulo, 3)

El rectángulo que contiene este elemento, se puede definir directamente sobre la llamada especificando los 4 valores sin necesidad de crear un objeto de rectángulo:
# Dibuja la elipse utilizando el rectángulo definido
pygame.draw.ellipse(ventana, (0, 255, 0), (100, 100, 200, 150), 3)
Dejamos este capítulo aquí. Nos quedan aún algunas funciones más por ver de pygame.draw
. Eso será en el siguiente.
Comentarios
Si te quedan dudas sobre el temario, sobre Python, los videojuegos, cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.