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.