Rivivi un classico. Ecco una breve realizzazione del gioco Pong di Atari in Python con l’aiuto di PyGame.

Rivivi un classico. Ecco una breve realizzazione del gioco Pong di Atari in Python con l’aiuto di PyGame.

Novembre 12, 2023 0 Di Ruggero Grando

Un tocco realistico al rimbalzo della palla.

In questa parte vedremo come rendere più realistico il rimbalzo della palla sul paddle. Innanzitutto definiamo una nuova funzione per la gestione della collisione come di seguito descritto.

def ball_paddle_collision(ball, paddle, is_left_paddle):
    if ball.colliderect(paddle):
        # Calcola la distanza tra il centro della palla e il centro del paddle
        distance_from_center = abs(ball.centery - paddle.centery)
        
        # Calcola il rapporto tra la distanza dal centro e la metà dell'altezza del paddle
        collision_position_ratio = distance_from_center / (paddle.height / 2)
        
        # Calcola la nuova velocità della palla sulla base di dove ha colpito il paddle
        speed_multiplier = 1 + 0.5 * collision_position_ratio  # Puoi modificare il 0.5 per rendere l'effetto più o meno pronunciato
        
        global ball_x_speed, ball_y_speed
        ball_x_speed = -ball_x_speed * speed_multiplier  # Inverte la direzione x della palla e modifica la velocità
        ball_y_speed += collision_position_ratio * ball_y_speed  # Modifica la velocità y della palla
        
        if is_left_paddle:
            hit_sound_paddle_left.play()
        else:
            hit_sound_paddle_right.play()

Il codice è abbastanza commentato, ma è necessaria una spiegazione più approfondita.

if ball.colliderect(paddle):

Questa linea controlla se la palla (ball) sta “collidendo” con il paddle. Se c’è una collisione, il codice all’interno del blocco if verrà eseguito.

codedistance_from_center = abs(ball.centery - paddle.centery)

Qui, si calcola la distanza verticale tra il centro della palla e il centro del paddle. Si utilizza la funzione abs per ottenere il valore assoluto della differenza, così la distanza è sempre un numero positivo.

codecollision_position_ratio = distance_from_center / (paddle.height / 2) 

Questa linea calcola quanto lontano la palla ha colpito dal centro del paddle, in termini relativi alla metà dell’altezza del paddle. Se la palla colpisce il centro del paddle, il rapporto è 0 ; se colpisce il bordo superiore o inferiore del paddle, il rapporto è 1 .

codespeed_multiplier = 1 + 0.5 * collision_position_ratio

Questa linea determina quanto la velocità della palla dovrebbe essere modificata a seguito della collisione. Se la palla colpisce il centro del paddle, la velocità rimane invariata; se colpisce il bordo del paddle, la velocità aumenta.

global ball_x_speed, ball_y_speed 
ball_x_speed = -ball_x_speed * speed_multiplier 
ball_y_speed += collision_position_ratio * ball_y_speed

Qui, le variabili globali ball_x_speed e ball_y_speed vengono modificate per riflettere la nuova direzione e velocità della palla dopo la collisione. ball_x_speed viene invertita e moltiplicata per il moltiplicatore di velocità, mentre ball_y_speed viene modificata in base alla posizione di collisione.

if is_left_paddle: 
  hit_sound_paddle_left.play() 
else: 
  hit_sound_paddle_right.play()

Infine, a seconda del paddle che è stato colpito (sinistra o destra), viene riprodotto un suono appropriato. Questa parte della riproduzione del suono è stata spostata.

A questo punto, ho modificato la gestione della collisione del paddle con la palla nel ciclo principale while come di seguito descritto.

# Collisione della palla con i paddle
    ball_paddle_collision(ball_pos, left_paddle_pos, is_left_paddle=True)
    ball_paddle_collision(ball_pos, right_paddle_pos, is_left_paddle=False)

Ora, il rimbalzo della palla è più realistico. Per quanto concerne i suoni, possiamo aggiungerli dopo, ora vorrei concentrarmi nella gestione di un bonus che può, se attraversato dalla palla, allargare il paddle del giocatore che l’ha colpita per ultimo fino al reset successivo.

Pagina Successiva | Pagina Precedente

No votes yet.
Please wait...

Pagine: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18