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.
Desafío
FácilDespué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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame