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.
Défi
FacileAprè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
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame