Il movimento con Scratch e il gioco del ping pong passo passo

Il movimento sullo stage di Scratch può essere realizzato reiterando spostamenti non troppo grandi.motoRett a

(Nota: l'argomento è ampiamente sviluppato nelle pubblicazioni di cinematica e dinamica della collana "Coding a scuola" dell'autore di questo articolo).

Uno spostamento rettilineo è un cambio di posizione in una direzione costante.


Con questo progetto link1 si sperimentano diversi tipi di moti rettilinei compreso il moto accelerato ed il rimbalazo di una palla, utile per creare un gioco di ping pong con pallina e racchetta

Con [tasto A] si attiva il moto con la modalità più semplice che consiste nel ripetere 100 volte un avanzamento elementare fisso di 5 passi in una direzione prescelta.

Il codice prevede un posizionamento ed una direzione iniziali dopodiché vengono ripetuti indefinitamente brevi spostamenti di 5 passi con la conseguente illusione del movomento (nota 1).

Il moto della palla procede fino oltre il bordo dello stage dove la traiettoria si spezza (nota 2).

 

In alternativa si tratta di fermare il moto con un ciclo di ripetizione condizionata "ripeti fino a quando <sta toccando _bordo_>"che è stato implementato nel blocco richiamato da [tasto B].

motoRimbalziRimbalzi sui bordi

L'avanzamento per creare il moto può essere ripetuto indefinitamente con il ciclo "per sempre" all'interno del quale si inserisce l'istruzione di rimbalzo quando lo sprite tocca il bordo come avviene con il blocco richiamato con [tasto C].

Quello che si osserva è il moto di una palla che rimbalza tutte le volte che tocca il bordo come avviene per una palla lanciata sul piano di un biliardo (nota 3).

Si può anche inserire un elemento di casualità nella direzione iniziale dell'angolo con l'istruzione di calcolo "numero a caso tra __ e __" come si fa con [tasto D].

 

La velocità.

Per modificare la velocità è sufficiente modificare il valore dell'incremento, o passo, per cui con il valore 6 la velocità sarà superiore e con 4 sarà inferiore.

 

Ping pong

Il gioco del ping pong con Scratch viene realizzato con una racchetta che deve rinviare la palla indietro con un angolo non casuale quando viene colpita (nota 4).

racchetta1La racchetta è uno sprite appositamente costruito a cui viene dato il nome "racchetta" e viene realizzata con un tratto rettilineo colorato in rosso.

La racchetta deve spostarsi solo in orizzontale e seguire la coordinata x del mouse grazie alle istruzioni di figura che devono essere eseguite in continuazione con il ciclo "per sempre".

Occorre adesso realizzare il rimbalzo della palla sulla racchetta in termini di evento che provoca la modifica del moto della palla in termini di direzione.

La condizione di rimbalzo si ottiene rilevando l'evento "quando (la palla) tocca la racchetta.

In questo caso la direzione del moto della palla deve cambiare radicalmente dato che prima del contatto stava viaggiando verso il basso e dopo il contatto deve essere respinta verso l'alto: ma con che direzione?

La direzione di rimbalzo

rimbalzoUna buona regola consiste nel rispettare le leggi della riflessione: l'angolo di incidenza deve essere uguale all'angolo di riflessione (nota 5).

La direzione assoluta del movimento di uno sprite è definita da un angolo misurato in senso orario a partire dall'asse delle y per cui alla direzione 0 corriponde un moto verso l'alto ed alla direzione 90 corrisponde un moto orizzontale a destra etc ...

La palla si sta avvcinando alla racchetta provenendo dall'alto per cui la direzione sarà compresa fra 91 e 269 gradi passando per 180.

Sulla base delle definizioni geometriche di figura deve essere:

αi = αr

 

Si pongono due casi a seconda che si voglia utilizzare un comando di direzione assoluta o di rotazione realtiva.

 

Utilizzo del comando di direzione assoluta "punta in direzione __"

In questo caso la direzione del rimbalzo viene calcolata in valore assoluto come angolo rispetto al sistema di coordinate del piano cartesiano di Scratch.

Il comando impone la direzione del movimento dello sprite in base alle rotazioni angolari assolute δi e δr riferite all'asse delle y.

La direzione del movimento della palla incidente è rappresentata dall'angolo δi (in blu) che c'è fra la direzione del moto e l'asse y.

La direzione del moto rimbalzato è data da δr (in verde).

Dal disegno si vede che δr è la stessa di -δi ma ribaltata di 180° per cui

δr = 180 - δi

Con [tasto E] si attivano sia il moto con rimbalzo, calcolato nel modo appena rappresentato, sia il controllo della racchetta tramite mouse.

 

rimbalzo2Utilizzo del comando di rotazione relativa "ruota cw di __" (nota 6)

Si può anche decidere di utilizzare il comando di rotazione relativa nel qual caso occorre calcolare la rotazione che deve effettuare lo sprite rispetto a se stesso per assumere il corretto angolo di rimbalzo.

Per recuperare la direzione δr a partire da quella attuale δi si deve immaginare di ruotare lo sprite due volte in senso orario di un angolo pari a (180 - δi) per avere la direzione (in viola) opposta a δr e poi di aggiungere 180 per capovolgerne la direzione.

δr = 2*(180 - δi) -180 = 180 - 2δi

Con [tasto F] si attivano sia il moto con rimbalzo, calcolato con angoli relativi allo sprite, sia il controllo della racchetta tramite mouse.

 

Miglioramenti

Il progetto può essere arricchito con il conteggio delle volte che la racchetta colpisce la palla e con un arresto del gioco nel caso la palla tocchi il fondo.

Meglio ancora aggiungendo la possibilità di imprimere un effetto alla palla quando si sposta di lato la racchetta nel momento del contatto. 

 

La parte che riguarda gli esperimenti effettuati con lo stesso progetto col il moto accelerato verranno eventualmente illustrati in un altro articolo apposito, altrimenti vedere fisica nei libri della collana "coding a scuola".

 

Note

nota 1: Il movimento viene creato dal cervello sulla base di variazioni di posizione anche discontinue link1. Spostamenti troppo grandi fanno cadere l'illusione del moto.

nota 2: Scratch non lascia scomparire lo sprite indicandone solo la posizione lungo uno dei due assi lasciando intravedere solo una sua parte. Un buon codice può prevedere la scomparsa dello sprite quando tocca il  ordo per non lasciare impressioni sbagliate ... ma non è questo lo scopo dell'articolo.

nota 3: Nel bliardo la palla si ferma dopo un po' per attrito, con Scratch non accade finchè non si inserisce nel codice una funzione di attrito.

nota 4: Nella versione attuale non riesco a fare apparire il segmento disegnato in modalità "vettoriale"; aggiungendo un piccolo segmento, la racchetta appare regolarmente. Il disegno della racchetta in modalià "bitmap" non coporta problemi.

nota 5: Sarebbe opportuno parlare di rimbalzi piuttosto che di riflessione. Perchè un rimbalzo dovrebbe seguire le leggi della riflessione? È una questione che riguarda la quantità di moto della palla e della sua variazione. Il moto della palla si può scomporre in due componenti: una parallela alla superficie di contatto ed una ad essa perpendicolare. Un superficie di contatto perfettamente elastica e priva di attrito (non è volutamente così per la racchetta da ping pong) ed una palla anch'essa elastica fa conservare alla palla la quantità di moto lungo la direzione parallela alla superficie mentre inverte di 180° la direzione verticale grazie all'impulso fornito dalla deformazione elastica della palla che si comprime sulla racchetta. La forma sferica della palla assicura la direzione radiale dell'impulso. In presenza di asimmetrie e di superfici con attrito si può conferire un angolo diverso da quello di riflessione (rimbalzo con effetto).

nota 6: cw significa clockwise, senso orario, che sul comado in forma grafica è rappresentato da un cerchiolino con freccia che ruota in senso orario.