Menu
CoddyTech

Colpisci la racchetta

Fa parte della sezione Progetti del percorso Pygame di Coddy. Lezione 14 di 31.

Quando la palla tocca una racchetta, dovrebbe tornare indietro. ball.colliderect(right) ti dice se si toccano.

Invertire il segno, vx = -vx, nasconde un’insidia. Se la palla è ancora dentro la racchetta nel fotogramma successivo (ha colpito il bordo della racchetta o la racchetta le è finita addosso), il segno si inverte ancora, e ancora: la palla trema dentro la racchetta.

Imposta la direzione invece di invertirla. abs(vx) è vx senza il segno, quindi è sempre positivo:

if ball.colliderect(left):
    vx = abs(vx)
if ball.colliderect(right):
    vx = -abs(vx)

Dalla racchetta sinistra la palla va sempre a destra, e da quella destra sempre a sinistra, indipendentemente da quanti fotogrammi rimangono a contatto.

challenge icon

Sfida

Medio

Dopo il rimbalzo contro la parete, quando la palla collide con left, imposta vx = abs(vx); quando collide con right, imposta vx = -abs(vx).

Provalo tu

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()

ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)

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_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Pygame