Menu
CoddyTech

I rettangoli sembrano ingiusti

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 21 di 36.

Fai volare la nave verso la palla chiodata con i tasti freccia. Le collisioni tra Rect, colliderect, sono veloci e semplici, ma con una palla rotonda ingannano. Il Rect della palla è il quadrato che la circonda, con gli angoli trasparenti e tutto il resto, e il Rect della nave ha uno spazio vuoto accanto alla punta.

Rendi visibile il test: traccia il contorno del Rect della palla e colora il contorno in base a ciò che dice colliderect.

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

Poi avvicinati alla palla da sud-est. Il contorno diventa rosso mentre tra la nave e gli spuntoni c'è ancora un chiaro spazio di cielo: gli angoli dei due Rect si sovrappongono, ma non le immagini. In un gioco questo significa perdere una vita per niente, e i giocatori se ne accorgono.

Le lezioni successive mettono alla prova le immagini stesse.

challenge icon

Sfida

Facile

Dopo aver disegnato la palla e l’astronave, traccia il contorno di ball_rect, largo 2 pixel: rosso (230, 60, 60) mentre ship_rect collide con esso, grigio (90, 90, 120) altrimenti. Poi fai entrare l’astronave dall’angolo in basso a destra e osserva gli angoli.

Provalo tu

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

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame