Capitolo 10
Creare una animazione

Livello: Medio
Questo capitolo presenta due differenti temi con l’obiettivo di creare animazioni in XLOGO.

10.1 Le cifre della calcolatrice

PIC

Questo tema è basato sul fatto che tutte le cifre delle calcolatrici potrebbero essere disegnate secondo lo schema qui sopra. Per esempio per disegnare la cifra 4 illuminiamo i rettangoli 3,4,5,7. Per disegnare la cifra 8, illuminiamo tutti i rettangoli. Per disegnare la cifra 3 illuminiamo i rettangoli 2,3,4,5,6.

10.1.1 Riempire un rettangolo

PIC

Se vogliamo disegnare un rettangolo colorato di dimensioni 100 per 200 una prima possibilità potrebbe essere di disegnare un rettangolo vuoto di 100x200, quindi un altro rettangolo di 99x199 e così via…fino a che il rettangolo sarà completamente pieno.
Cominciamo definendo un rettangolo con due variabili corrispondenti alla base ed alla altezza.


Codice 10.1: Un semplice rettangolo dati i due lati
Per rec :h :w 
  Ripeti 2[Av :h DX 90 Av :w DX 90] 
Fine

Per riempire un rettangolo dobbiamo scrivere:
rec 100 200 rec 99 199 rec 98 198 ..... rec 1 101

Definiamo quindi una procedura per questo rettangolo riempito.


Codice 10.2: Un rettangolo colorato
Per rettangolo :h :w 
  rec :h :w 
  rettangolo :h-1 :w-1 
Fine

Verifichiamo con rettangolo 100 200 e capiamo che c’è un problema. La procedura non si ferma dopo aver riempito tutto il rettangolo. Dobbiamo inserire un comando di uscita che capisca quando la base o l’altezza diventano 0. Quando si realizza questa condizione il programma si deve fermare con la primitiva Ferma.


Codice 10.3: Una migliore implementazione del rettangolo colorato
Per rettangolo :h :w 
  Se o :h=0 :w=0 [Ferma] 
  rec :h :w 
  rettangolo :h-1 :w-1 
Fine

Invece di usare la primitiva o è possibile usare il simbolo “|”, la riga 2 diventa: Se :h=0 | :w=0 [Ferma].

10.1.2 Il programma

Dobbiamo riutilizzare il precedente rettangolo riempito. Supponiamo che la tartaruga comincia dall’angolo in basso a sinistra. Definiamo una procedura chiamata numero che accetta 7 argomenti: :a, :b, :c, :d, :e, :f, :g. Quando :a è uguale a 1 disegniamo il rettangolo 1. Se :a è uguale a 0 non disegniamo alcun rettangolo. Questa è la idea principale.
Il programma:


Codice 10.4: Disegnare un numero fatto di rettangoli
Per numero :a :b :c :d :e :f :g 
# disegniamo il rettangolo 1 
Se :a=1 [rettangolo 160 40] 
# disegniamo il rettangolo 2 
Se :b=1 [rettangolo 40 160] 
PennaSu DX 90 Avanti 120 SX 90 PennaGiu 
# disegniamo il rettangolo 3 
Se :c=1 [rettangolo 160 40] 
PennaSu Avanti 120 PennaGiu 
# disegniamo il rettangolo 5 
Se :e=1 [rettangolo 160 40] 
# disegniamo il rettangolo 4 
SX 90 PennaSu Indietro 40 PennaGiu 
Se :d=1 [rettangolo 160 40] 
# disegniamo il rettangolo 6 
DX 90 PennaSu Avanti 120 SX 90 PennaGiu 
Se :f=1 [rettangolo 160 40] 
# disegniamo il rettangolo 7 
PennaSu Avanti 120 SX 90 Indietro 40 PennaGiu 
Se :g=1 [rettangolo 160 40] 
end

10.1.3 Creare l’animazione

In questa parte definiamo il conteggio a rovescio da 9 a 0.


Codice 10.5: Conteggio a rovescio da 9 a 0
Per countd 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 1 1 1 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 1 1 1 1 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 0 1 1 0 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 1 0 1 1 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 0 1 1 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 1 1 0 1 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 1 1 0 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 0 1 1 1 0 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 0 1 0 0 Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 0 1 1 1 Aspetta 60 
Fine

C’è un piccolo problema, un effetto di sfarfallamento durante il disegno di ciascuna cifra. Per rendere l’animazione più fluida useremo la modalità di animazione mediante tre primitive:

Modifichiamo il programma in questo modo:


Codice 10.6: Animazione del conteggio a rovescio da 9 a 0
Per countd 
  Animazione 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 1 1 1 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 1 1 1 1 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 0 1 1 0 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 1 0 1 1 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 0 1 1 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 1 1 0 1 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 1 1 1 1 1 0 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 0 1 1 1 0 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 0 0 1 0 1 0 0 Ridisegna Aspetta 60 
  PulisciSchermo NascondiTartaruga numero 1 1 1 0 1 1 1 Ridisegna Aspetta 60 
  FermaAnimazione 
Fine

10.2 L’uomo che cresce

PIC

Come prima cosa definiamo una procedura uomo che disegna lo schema qui sopra. Usiamo una variabile per riprodurlo a scale diverse.


Codice 10.7: Disegno di un uomo stilizzato
Per uomo :c 
  SX 154 Avanti 44*:c Indietro 44*:c 
  SX 52 Avanti 44*:c Indietro 44*:c 
  SX 154 Avanti 40*:c 
  SX 154 Avanti 44*:c Indietro :c*44 
  SX 52 Avanti 44*:c Indietro :c*44 
  SX 154 Avanti 10*:c 
  SX 90 Ripeti 180[Avanti :c/2 DX 2] DX 90 
Fine

Adesso creiamo una animazione che farà crescere l’uomo. Per realizzare ciò disegniamo uomo 0.1, quindi uomo 0.2, uomo 0.3…fino a uomo 5. Fra ciascun uomo cancelliamo l’area di disegno. Otteniamo due diverse procedure:


Codice 10.8: Disegno di un uomo che cresce
Per uomo :c 
  SX 154 Avanti 44*:c Indietro 44*:c 
  SX 52 Avanti 44*:c Indietro 44*:c 
  SX 154 Avanti 40*:c 
  SX 154 Avanti 44*:c Indietro :c*44 
  SX 52 Avanti 44*:c Indietro :c*44 
  SX 154 Avanti 10*:c 
  SX 90 Ripeti 180[Avanti :c/2 DX 2] DX 90 
  Se :c=5[Ferma] 
  PulisciSchermo NascondiTartaruga uomo :c+0.1 
Fine 
 
Per via 
  PulisciSchermo NascondiTartaruga 
  uomo 0 
Fine

Alla fine per rendere l’animazione fluida useremo la modalità animazione e la primitiva Ridisegna.


Codice 10.9: Animazione di un uomo che cresce
Per uomo :c 
  SX 154 Avanti 44*:c Indietro 44*:c 
  SX 52 Avanti 44*:c Indietro 44*:c 
  SX 154 Avanti 40*:c 
  SX 154 Avanti 44*:c Indietro :c*44 
  SX 52 Avanti 44*:c Indietro :c*44 
  SX 154 Avanti 10*:c 
  SX 90 Ripeti 180[Avanti :c/2 DX 2] DX 90 
  Ridisegna 
  Se :c=5[Ferma] 
  PulisciSchermo NascondiTartaruga uomo :c+0.1 
Fine 
 
Per via 
  PulisciSchermo NascondiTartaruga Animazione 
  uomo 0 
  FermaAnimazione 
Fine

Nota: qui la procedura uomo è ricorsiva. Avremmo anche potuto usare la primitiva RipetiPer per assegnare alla variabile :c i valori da 0.1 a 5, in questo modo:


Codice 10.10: Animazione non ricorsiva di un uomo che cresce
Per uomo :c 
  PulisciSchermo SX 154 Avanti 44*:c Indietro 44*:c 
  SX 52 Avanti 44*:c Indietro 44*:c 
  SX 154 Avanti 40*:c 
  SX 154 Avanti 44*:c Indietro :c*44 
  SX 52 Avanti 44*:c Indietro :c*44 
  SX 154 Avanti 10*:c 
  SX 90 Ripeti 180[Avanti :c/2 DX 2] DX 90 
  Ridisegna 
Fine 
 
Per go 
  NascondiTartaruga Animazione 
  RipetiPer [c 0 5 0.1][uomo :c] 
  FermaAnimazione 
Fine