Saltar la navegación

3.3. Imágenes en movimiento

Diseño de obstáculos en Pygame

Al diseñar un juego, el jugador (gameplayer) debe esquivar obstáculos. Los obstáculos son objetos que no disparan y se mueven por la pantalla.

  • ¿Cómo saber dónde dibujar los obstáculos?
  • ¿Qué método usar para que el obstáculo esté volando por la pantalla?
  • ¿Qué pasa si queremos que tus imágenes estén animadas?

Puedes manejar todas estas situaciones y más con sprites.

Sprites en Pygame

En términos de programación, un sprite es una representación 2D de un objeto en la pantalla, esencialmente una imagen que puede moverse, animarse o interactuar con otros elementos del juego. En Pygame, los sprites son fundamentales para manejar y organizar los elementos visuales del juego, como personajes, enemigos, proyectiles y otros objetos interactivos.

La Clase Sprite en Pygame

Pygame proporciona una clase llamada Sprite, que está diseñada específicamente para contener y gestionar las representaciones gráficas de los objetos del juego que se desean mostrar en la pantalla. Un sprite en Pygame no solo incluye la imagen del objeto, sino también toda la lógica necesaria para su comportamiento, como el movimiento, la animación y la detección de colisiones.

Uso de la Clase Sprite

Para utilizar un sprite en Pygame, es común crear una nueva clase que extienda la clase Sprite. Al hacerlo, la nueva clase hereda los métodos y atributos de la clase Sprite, lo que facilita la manipulación del sprite en el juego. Por ejemplo, puedes manejar su posición en la pantalla, actualizar su estado en cada fotograma, y gestionar sus colisiones con otros sprites.

import pygame

class MiSprite(pygame.sprite.Sprite):
    def __init__(self, image_path, position):
        super().__init__()  # Inicializa la clase Sprite
        self.image = pygame.image.load(image_path)  # Carga la imagen del sprite
        self.rect = self.image.get_rect()  # Obtiene el rectángulo de la imagen
        self.rect.topleft = position  # Establece la posición inicial del sprite

    def update(self):
        # Aquí se definirían las acciones que debe realizar el sprite en cada fotograma
        self.rect.x += 5  # Ejemplo: mover el sprite 5 píxeles a la derecha

# Inicializar Pygame
pygame.init()

# Crear una ventana
screen = pygame.display.set_mode((800, 600))

# Crear una instancia del sprite
mi_sprite = MiSprite('imagen.png', (100, 100))

# Bucle principal del juego
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Actualizar el sprite
    mi_sprite.update()

    # Dibujar el sprite en la pantalla
    screen.fill((0, 0, 0))  # Limpiar la pantalla con un color negro
    screen.blit(mi_sprite.image, mi_sprite.rect)  # Dibujar el sprite en la pantalla
    pygame.display.flip()  # Actualizar la pantalla

# Salir de Pygame
pygame.quit()
    

Ventajas de Usar Sprites

Organización: Los sprites te permiten organizar el código del juego de manera más limpia y modular, ya que cada objeto del juego puede ser representado por una clase que extiende Sprite.

Facilidad de Actualización: Pygame incluye grupos de sprites (pygame.sprite.Group) que facilitan la actualización y dibujo de múltiples sprites al mismo tiempo.

Colisiones: La clase Sprite y sus grupos ofrecen métodos eficientes para detectar colisiones entre objetos, lo que es crucial en la mayoría de los juegos.

Completa el código

# Movimiento aleatorio sin rebote y con desaparición
import random

# Inicializar la dirección del movimiento en x e y
speed_x = random.choice([-5, 5])
speed_y = random.choice([-5, 5])

def update(self):
    self.rect.x += speed_x
    self.rect.y += speed_y

# Verificar si el sprite sale de la pantalla y eliminarlo si es así
if (self.rect.right < 0 or self.rect.left > screen.get_width() or
self.rect.bottom < 0 or self.rect.top > screen.get_height()):
    self.kill() # Eliminar el sprite del grupo

Integra el fragmento de código en un código más grande que consiga que el sprite se mueva aleatoriamente y desaparezca cuando sale de la pantalla. Recuerda que el sprite es un rectángulo

Caso práctico

Entras a trabajar como programador o programadora en prácticas en una empresa de videojuegos y te toca sustituir a alguien que dejó inconcluso un código:

import random # Inicializar la dirección del movimiento en x e y
speed_x = random.choice([-5, 5])
speed_y = random.choice([-5, 5])
def update(self):
 self.rect.x += speed_x
 self.rect.y += speed_y

Redacta las líneas de código que hagan falta para coseguir que el sprite rebote en los bordes de la pantalla.

Redacta las líneas de código que hagan falta para coseguir que el sprite se transfiera al extremo contrario de la pantalla al tocar el borde.

Licencia: licencia propietaria intelectual

Creado con eXeLearning (Ventana nueva)