Curso de desarrollo de videojuegos con Python

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))
Rectángulo en Pygame

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)
Rectángulo hueco en Pygame

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))
Cuadrado en Pygame

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 tipo Surface 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 tipo RectValue 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 de border_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 de border_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 de border_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 de border_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).

Border radius en rectángulo de Pygame

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.

Círculos en Pygame

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)
Círculo fragmentado en Pygame

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 objeto Surface 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)
Triángulos en Pygame

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)
Bordes para triángulos en Pygame

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 objeto Surface 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 objeto Rect 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)
Elipse en Pygame

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)
Elipse hueca en Pygame

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.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.