05 - Colpisci La Talpa.
Logo di scratch
05 - Colpisci La Talpa. /1
Logo di scratch
immagine

Realizziamo un giochino vero e proprio?


Questo è il classico gioco per bimbi che si trova nelle sale gioco, versione app.
La talpa viene fuori a sorpresa da una buca e bisogna colpirla per fare un punto.
La nostra app gestirà l'apparizione e la sparizione della talpa, il colpo ricevuto dalla talpa, il punteggio, la fine della partita, l'avvio di una nuova partita.


Bene, cominciamo! :-)


Avvia un nuovo progetto e chiamalo "ColpisciLaTalpa".

Sistema quindi tutti gli elementi che ci servono.


Prima di tutto posiziona una Canvas le cui proprietà Width ed Height sono impostate rispettivamente a FillParent e 320 pixel,
mentre la prorpietà BackgroundColor vale Green.

Poi, su di essa, 9 elementi ImageSprite.
Mediante la proprietà Picture di ImageSprite assegna a 7 di questi elementi l'immagine qui a sinistra, e a gli ultimi due le immagini successive.

immagine immagine immagine

Le immagini sono:
www.bbuio.it/didattica/appinventor/schede/img/buca.png
www.bbuio.it/didattica/appinventor/schede/img/talpaSu.png
www.bbuio.it/didattica/appinventor/schede/img/talpaGiu.png

Rinomina questi elementi così: imgBuca1, imgBuca2, imgBuca3, imgBuca4, imgBuca5, imgBuca6, imgBuca7, imgTalpaColpita, imgTalpaFuori.

Infine, imposta la proprieta visible degli ultimi due elementi a false.

05 - Colpisci La Talpa. /2
Logo di scratch
immagine

Successivamente sistema un elemento layout
come quello qui a sinistra

immagine

e al suo interno
quattro elementi di tipo Label (in UserInterface).

Rinomina le label in alto LblScrittaPunteggio e lblScrittaRecord
e quelle in basso LblPunteggio e LblRecord.

Imposta le proprietà FontTypeface e TextAlignment di tutte e quattro rispettivamente a monospace e center.

Imposta infine la proprietà FontSize
delle label in alto a 14pt e di quelle in basso a 34pt.


E per concludere un bel pulsantone (Button).

immagine

con le proprietà che puoi immaginare dall'immagine qui accanto

All'inizio questo elemento sarà non visibile.


Passiamo ora ai componenti non visualizzabili.


immagine

Comincia con quattro elementi di tipo Clock:
timerTalpaFuori, timerTalpaColpita, timerTalpaDentro e timerPerCancellazioneBuche.

Ciascun timer partirà disabilitato (TimerEnabled senza check)
e ciascun timer si fermerà quando l'app non sarà utilizzata
(TimerAlwaysFires senza check).

Passiamo ora a descrivere la proprietà TimerInterval.

La quantità di tempo che la talpa passa con la testolina fuori
(timerTalpaFuori) è di un secondo .

Scoprirai presto che così il gioco è troppo facile:
riduci questo valore e sarà più divertente.

La quantità di tempo che la talpa resta fuori dalla buca dopo un colpo
con la faccia sconvolta (timerTalpaColpita) è di un secondo.

La quantità di tempo che la talpa resta nascosta
(timerTalpaDentro) è di 250 millisecondi.

Infine, per la gestione della cancellazione delle buche
(un'animazione simpatica con la quale chiudiamo il gioco)
ci servirà un timer (timerPerCancellazioneBuche) di 10 millisecondi.

05 - Colpisci La Talpa. /2
Logo di scratch
immagine

Aggiungi poi un elemento Sound,
che useremo per far vibrare il dispositivo
tutte le volte che una talpa viene colpita,

immagine

e elemento TinyDB,
che useremo per memorizzare in modo persistente
il punteggio più alto ottenuto in una partita.


Passa ora in modalità Blocks e occupiamoci della dinamica della app.


immagine

Cosa faremo all'avvio dell'app?


Per prima cosa ci occupiamo
della visualizzazione corretta delle Label nel TableArrangement.

immagine

Andiamo poi a prelevare l'informazione
relativa al record precedentemente effettuato.

immagine

Prima di andare avanti è indispensabile fare un cenno
alla dinamica che intendiamo realizzare.

La talpa deve uscire da una buca a caso:
quindi prima selezioneremo una buca con una random
e poi l'immagine della talpa verrà sovrapposta all'immagine della buca scelta.

Per far ciò la cosa più comoda è gestire le sette buche come una lista di oggetti.

05 - Colpisci La Talpa. /2
Logo di scratch

Dichiara la variabile globale listaDelleBuche inizializzandola ad una lista vuota

immagine

e poi nel blocco Screen1.Initialize riempi la lista

immagine

Bene, il gioco comincia attivando il timer timerTalpaDentro
che sarà quindi l'ultimo blocco di Screen1.Initialize.

immagine
immagine

Quando è stata sotto terra abbastanza,

dobbiamo selezionare una buca a caso dalla nostra lista
ed impostare le coordinate di imgTalpaFuori alle coordinate di questa buca
dobbiamo poi, ovviamente, rendere visibile l'immagine imgTalpaFuori.

immagine
05 - Colpisci La Talpa. /3
Logo di scratch
immagine immagine

Attenzione!
Se l'elemento qui a sinistra non ti è familiare, vuol dire che non hai mai visistato l'albero AnyComponent dell'area Blocks.


L'ultima cosa che bisogna fare quando scade il timer timerTalpaDentro
è la gestione dei timer.

Poichè la talpa non è più nascosta, ma è visibile,
dobbiamo disabilitare il timer timerTalpaDentro
ed abilitare il timer timerTalpaFuori.

immagine
immagine

Quando si è mostrata per un po',

bisogna farla tornare sotto terra:
rendendo non visibile l'immagine imgTalpaFuori
ritornerà visibile la buca sottostante.

immagine

Infine, avendo rimesso la talpa sotto terra
bisognerà azionare il timer timerTalpaDentro
e disabilitare quello che gestisce il tempo durante il quale la talpa sta fuori (imgTalpaFuori)

immagine
05 - Colpisci La Talpa. /4
Logo di scratch
immagine

E se invece l'utente riesce
a schiacciare la talpa?

In questo caso dovremo:
rendere non visibile l'immagine relativa alla talpa felice

immagine

rendere visibile - e alle giuste coordinate -
l'immagine relativa alla talpa dolorante

immagine

far vibrare il dispositivo

immagine

aggiornare il punteggio

immagine

disabilitare il timer relativo alla talpa felice
ed abilitare quello relativo alla talpa colpita

immagine
05 - Colpisci La Talpa. /5
Logo di scratch

Attenzione!
Abbiamo scelto di gestire l'evento TouchDown
perchè questo viene attivato anche se si trascina un po' il dito,
mentre l'evento Touched
viene attivato solo se l'utente finisce il tocco dove lo ha cominciato.


immagine

Quando scade il timer relativo alla talpa colpita

rendiamo non più visibile l'immagine della talpa sconvolta
(lasciando quindi visibile all'utente l'immagine sottostante della buca)

immagine

disabilitiamo questo timer
e abilitiamo quello relativo al tempo che la talpa trascorre sotto terra.

immagine

Abbiamo detto che la partita si chiude quando l'utente tocca una buca vuota.
Dobbiamo quindi apprestarci a gestire tutti questi eventi.

immagine

La prima cosa da fare è
verificare che sulla buca appena toccata
non ci sia l'immagine della talpa da colpire!

In questo caso infatti,
l'utente ha toccato la talpa e non dobbiamo chiudere la partita!

Poichè tale verifica deve essere fatta per tutte le buche
ci conviene fare un blocco generico: una procedura.

05 - Colpisci La Talpa. /6
Logo di scratch
immagine

La buca si trova sotto
l'immagine della talpa se:

l'Immagine della talpa è visibile.

immagine

le coordinate delle ascisse coincidono

immagine

le coordinate delle ordinate coincidono.

immagine

Quindi, la buca si trova sotto l'immagine della talpa
se queste tre condizioni sono vere contemporaneamente.

immagine

Poichè a noi interessa verificare che la buca sia libera
(cioè che non si trovi sotto la talpa)
verifichiamo che la condizione sia falsa!

immagine

Riassumendo:

immagine
05 - Colpisci La Talpa. /7
Logo di scratch
immagine

Per ciascuna buca,
quindi,
andremo a realizzare
un blocco come questo.

e poichè che l'utente tocchi una buca o un'altra
le attività da svolgere saranno sempre le stesse

immagine

invocheremo sempre la stessa procedura.


immagine

Cosa fare per chiudere la partita?

Assicuriamoci di rendere non visibile le eventuali immagini della talpa.

immagine

Disabilitiamo tutti i timer validi duranti una partita.

immagine

Abilitiamo il timer che avvia una simpatica animazione
con la quale sparisocno tutte le buche.

immagine
05 - Colpisci La Talpa. /8
Logo di scratch

Se il punteggio ottenuto è superiore a quello memorizzato come record
allora memorizza il nuovo record.

immagine

Rendiamo visibile il pulsante per cominciare una nuova partita.

immagine

La conclusione della partita ha avviato l'animazione attivando questo timer.

immagine

Ogni dieci millesimi di secondo
questo timer scade
e procede con le seguenti attività.

Per prima cosa,
riduce di un pixel l'ampiezza di ciascuna buca

immagine

e poi quando la dimensione di una buca qualsiasi vale 1
interrompe l'animazione, disabilitando questo stesso timer

immagine
05 - Colpisci La Talpa. /9
Logo di scratch
immagine

Concludiamo vedendo le attività da svolgere
alla pressione del tasto
per cominciare una nuova partita.

Per prima cosa,
ripristiniamo l'ampiezza di tutte le immagini relative alle buche;

immagine

dopodichè resettiamo il punteggio

immagine

successivamente aggiorniamo il valore del record

immagine

poi nascondiamo questo stesso tasto

immagine

infine avviamo il timer che fa avviare il gioco

immagine
05 - Colpisci La Talpa. /9
Logo di scratch

SFIDE


(1)
Sembra tutto molto ragionevole, ma se premi il tasto "comincia una nuova partita" non appena compare (cioè prima che le buche siano state ridotte a zero) il programma si comporta in modo sbagliato.
Sai mettere a posto questo bug?


(2)
Sei capace di memorizzare anche il nome della persona che fa il record? Il nome potrebbe poi sostituire la scritta "Record".

(3)
Invece che la gestione dei record usa quello spazio per tenere traccia di quante volte la talpa la fa franca (esce e non viene presa). La partita potrebbe terminare quindi anche per l'aver raggiunto 10 uscite fortunate per la talpa.


(4)
Prova a riprogettare l'app facendo in modo che la talpa possa uscire in un punto qualsiasi del prato.