Menu
CoddyTech

Colpisci la racchetta

Lezione 32 di 40 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

Dopo il rimbalzo contro la parete, quando la palla entra in collisione con left, imposta vx = abs(vx); quando entra in collisione 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 Crea giochi con Pygame

Esercitati da solo: Playground Pygame