Menu
CoddyTech

Los rectángulos parecen injustos

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 21 de 36.

Vuela con la nave hacia la bola de pinchos usando las teclas de flecha. Las colisiones entre Rect, colliderect, son rápidas y sencillas, pero no son precisas para una bola redonda. El Rect de la bola es el cuadrado que la rodea, incluidas las esquinas transparentes, y el Rect de la nave tiene espacio vacío junto a la punta.

Haz que la prueba sea visible: dibuja el contorno del Rect de la bola y colorea el contorno según lo que indique colliderect.

if ship_rect.colliderect(ball_rect):
    colour = (230, 60, 60)
else:
    colour = (90, 90, 120)
pygame.draw.rect(screen, colour, ball_rect, 2)

Después, acércate a la bola desde abajo a la derecha. El contorno se pone rojo mientras todavía hay un claro espacio de cielo entre la nave y los pinchos: las esquinas de los dos Rect se superponen, pero las imágenes no. En un juego, eso significa perder una vida sin motivo, y los jugadores se dan cuenta.

En las siguientes lecciones se comprobarán las propias imágenes.

challenge icon

Desafío

Fácil

Después de dibujar la bola y la nave, dibuja el contorno de ball_rect, de 2 píxeles de ancho: rojo (230, 60, 60) mientras ship_rect colisione con él; gris (90, 90, 120) en caso contrario. Después, haz volar la nave desde la esquina inferior derecha y observa las esquinas.

Pruébalo tú mismo

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Near Miss")
clock = pygame.time.Clock()

ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(topleft=(420, 320))
ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
ball_rect = ball.get_rect(center=(320, 240))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 4
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 4
    if keys[pygame.K_UP]:
        ship_rect.y -= 4
    if keys[pygame.K_DOWN]:
        ship_rect.y += 4

    screen.fill((20, 22, 40))
    screen.blit(ball, ball_rect)
    screen.blit(ship, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame