Menu
CoddyTech

Colpisci la racchetta

Lezione 32 di 41 del corso Crea giochi con Pygame di Coddy.

Quando la palla tocca una racchetta, dovrebbe dirigersi nella direzione opposta. ball.colliderect(right) ti dice se si toccano.

Invertire il segno, vx = -vx, nasconde un’insidia. Se al frame successivo la palla è ancora dentro la racchetta (ha urtato l’estremità della racchetta oppure la racchetta le si è spostata addosso), il segno viene invertito ancora, e ancora: la palla vibra 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)

La palla si allontana sempre verso destra dalla racchetta sinistra e verso sinistra da quella destra, indipendentemente da quanti frame rimane a contatto.

challenge icon

Sfida

Medio

Fai rimbalzare la palla sulle palette.

  1. Dopo il rimbalzo contro il muro, quando la palla collide con left, imposta vx = abs(vx).
  2. Quando collide con right, imposta vx = -abs(vx).

Premi «Gioca» e intercetta la palla con la paletta destra: rimbalzerà indietro. Poi premi «Verifica».

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

Tutte le lezioni di Crea giochi con Pygame

Esercitati da solo: Playground Pygame