Menu
CoddyTech

Les rectangles semblent injustes

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 21 sur 36.

Pilote le vaisseau vers la boule à pointes avec les touches fléchées. Les collisions entre Rect, colliderect, sont rapides et simples, mais elles mentent pour une boule ronde. Le Rect de la boule est le carré qui l’entoure, avec ses coins transparents et tout, et le Rect du vaisseau comporte un espace vide à côté de sa pointe.

Rends le test visible : trace le contour du Rect de la boule et colore-le selon le résultat de colliderect.

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

Ensuite, approche la boule par le bas à droite. Le contour devient rouge alors qu’un espace de ciel bien visible sépare encore le vaisseau des pointes : les coins des deux Rect se chevauchent, mais pas les images. Dans un jeu, cela fait perdre une vie pour rien, et les joueurs le remarquent.

Les prochaines leçons testeront les images elles-mêmes.

challenge icon

Défi

Facile

Après avoir dessiné la balle et le vaisseau, trace le contour de ball_rect avec une épaisseur de 2 pixels : en rouge (230, 60, 60) lorsque ship_rect entre en collision avec lui, en gris (90, 90, 120) sinon. Fais ensuite arriver le vaisseau depuis le coin inférieur droit et observe les coins.

Essayez vous-même

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()

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame