YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

Transcript
  • Giocare e vincere con Excel

    Gianclaudio Floria - Andrea Terzaghi

  • Giocare e vincere con Excel

    Autore: Gianclaudio Floria - Andrea Terzaghi

    Collana:

    Coordinamento collana: Fabrizio ComolliProgetto graco: escom - Milano

    Prima edizioneISBN: 88-8233-?????

    Copyright 2006 Edizioni FAG Milano Via G.Garibaldi 5 20090 Assago (MI) - www.fag.it

    Finito di stampare: nel mese di marzo 2006 da G. Canale & C. S.p.a., Borgaro Torinese (Torino)

    Edizione Speciale per Vogel Burda Communications srl stampata su licenza di FAG

    Nessuna parte del presente libro pu essere riprodotta, memorizzata in un sistema che ne permetta lelaborazione, n trasmessa in qualsivoglia forma e con qualsivoglia mezzo elettronico o meccanico, n pu essere fotocopiata, riprodotta o registrata altrimenti, senza previo consenso scritto delleditore, tranne nel caso di brevi citazioni contenute in articoli di critica o recensioni.

    La presente pubblicazione contiene le opinioni dellautore e ha lo scopo di fornire informazioni precise e accurate. Lelaborazione dei testi, anche se curata con scrupolosa attenzione, non pu comportare speciche responsabilit in capo allautore e/o alleditore per eventuali errori o inesattezze.

    Nomi e marchi citati nel testo sono generalmente depositati o registrati dalle rispettive aziende.Lautore detiene i diritti per tutte le fotograe, i testi e le illustrazioni che compongono questo libro.

  • 123

    7. Costruire i videogiochi interattivi

    Se siete curiosi di capire come possibi-

    le realizzare i giochi del capitolo preceden-

    te, scoprirete adesso che i principi alla

    base della programmazione dei giochi sono

    semplici. La difcolt vera non nel-

    la programmazione, ma nel trovare

    unidea creativa.

    Dopo aver visto Pacman su Excel, vogliamo mostrare al lettore nel detta-glio come costruire questo tipo di giochi interattivi.Di fatto servono soprattutto fantasia, immaginazione e tanta voglia di di-vertirsi, mentre non sono richieste grandi capacit di programmazione. In questo capitolo ci concentreremo sulla programmazione, lasciando a voi il piacere di scatenare le vostre capacit creative. Gli elementi di base, comuni a tutti i giochi interattivi, sono tre:

    la gestione degli eventi da tastiera: il giocatore deve premere i tasti per interagire con il gioco;

  • 124

    Giocare e vincere con Excel

    la gestione del timer, per dare limpressione del movimento facen-do scorrere il tempo a intervalli regolari, in modo da far succedere continuamente qualcosa (un quadretto che si muove, una pallina che rimbalza, un ore che gira);

    la gestione delle immagini che rappresentano gli elementi del gio-co (eroi, mostri, palline, spade, proiettili, mura, cibo ecc.).

    Vediamo prima degli esempi semplici, in poche righe di codice, di gestione della tastiera e del timer, per comprenderne il signicato. Comporremo i due elementi in un primo gioco interattivo, Snake (lo stesso che si trova sui cellulari) e inne mostreremo ancora una volta con poche righe di codice come gestire le immagini. A questo punto il lettore avr tutti gli elementi per comprendere appieno il codice di Pacman e, dando fondo alla sua crea-tivit e alla sua fantasia, potr sviluppare un suo proprio gioco interattivo.

    Gestire gli eventi di tastiera

    La prima cosa da avere chiara che il gioco deve girare allinterno di una macro, dunque non possibile sfruttare la gestione della tastiera normale di Excel, per intenderci quella che usiamo quando scriviamo qualcosa in una cella o spostiamo il cursore nel foglio.Per fare in modo che una macro di Excel rilevi gli eventi di tastiera (pres-sione e rilascio di un tasto) necessario utilizzare una funzione di libreria di Windows:

    Declare Function GetAsyncKeyState Lib User32.dll (ByVal vKey As Long) As Long

    La funzione GetAsyncKeyState appartiene alla libreria User32.dll. Questa, a sua volta, una API (Application Programming Interface) di Windows. Le API sono uno strumento che ogni versione del sistema operativo Windows mette a disposizione. Esse permettono di accedere a funzio-nalit comuni a tutte le versioni del sistema sfruttandone appieno le po-tenzialit. Quella che sfrutteremo in questo caso una semplice funzione che rileva lo stato (premuto o rilasciato) di ogni singolo tasto. La funzione restituisce un valore diverso da zero se il tasto premuto nello stesso esatto momento in cui essa viene eseguita.

  • 125

    Giocare e vincere con Excel

    Il funzionamento di questa funzione molto semplice. Richiede come ar-gomento un numero intero che rappresenta il codice del tasto virtuale (Virtual-key Code) della tastiera. Per dirla in parole semplici, a ogni tasto corrisponde un numero, e la funzione GetAsyncKeyState interroga lo stato di quel tasto specico che corrisponde al numero passatole. Il codice che rileva lo stato dei tasti il seguente:

    Declare Function GetAsyncKeyState Lib User32.dll (ByVal vKey As Long) As Long

    Const VK_LEFT As Long = 37

    Const VK_DOWN As Long = 40

    Const VK_RIGHT As Long = 39

    Const VK_UP As Long = 38

    Const VK_Z As Long = 90

    Const VK_SHIFT As Long = 16

    Sub start()

    Dim Direzione As String

    While True

    If GetAsyncKeyState(VK_LEFT) 0 Then

    Direzione = Sinistra

    ElseIf GetAsyncKeyState(VK_RIGHT) 0 Then

    Direzione = Destra

    ElseIf GetAsyncKeyState(VK_UP) 0 Then

    Direzione = Su

    ElseIf GetAsyncKeyState(VK_DOWN) 0 Then

    Direzione = Giu

    Else

    Direzione =

    End If

    Cells(1, 1) = Direzione

    Wend

    End Sub

    La prima parte dichiara che nel codice verr utilizzata la funzione e che quindi essa deve essere recuperata dalla corrispondente libreria. Si de-niscono quindi delle costanti che rappresentano i codici di tasto virtuale appena discussi. Finalmente, si giunge al codice vero e proprio. Si tratta di un semplice ciclo perpetuo senza uscita dove t sempre vero. Dunque, non si esce mai dal ciclo while-wend se non premendo Esc, cio interrom-

  • 126

    Giocare e vincere con Excel

    pendo lesecuzione della macro. Allinterno del ciclo vi una variabile Direzione che assume il valore corrispondente alla freccia premuta. Nel ciclo (che data la velocit dei calcolatori attuali viene eseguito centinaia di volte al secondo) viene infatti vericata la pressione di quattro tasti: le quattro frecce di direzione. Nel caso in cui una determinata freccia sia premuta, la funzione GetAsyncKeyState corrispondente a quel tasto resti-tuisce un valore diverso da zero, quindi viene eseguita la parte then del corrispondente if e la variabile Direzione assume il valore corrispondente alla freccia premuta. Tale valore viene poi presentato allutente nella cella A1, (Cells(1,1)) del foglio di lavoro attivo.Non ce nulla di pi. Se volete vericare la pressione di un altro tasto oltre ai tasti freccia dovete solo reperire da Internet il codice del tasto virtuale corrispondente e aggiungere un altro if-then nel ciclo.

    Gestire il timer per dare un ritmo al gioco

    Nei giochi interattivi si sfrutta quindi lo stesso principio alla base dei l-mati. Si eseguono i fotogrammi del gioco in modo veloce uno sullaltro in modo da dare limpressione del movimento. Per fare questo bisogna avere un timer che faccia eseguire il codice a un ritmo costante e sufcien-temente elevato per dare alla sequenza di immagini statiche laspetto di un movimento.Per fare in modo che una porzione di codice venga eseguita con un ritmo cadenzato constante, anche in questo caso sono necessarie poche righe. Vediamo un piccolo programma che muove avanti e indietro una scritta sullo schermo:

    Sub timer_esempio()

    Dim F As Worksheet

    Dim Stato As Range

    Dim TIMEDELAY As Double

    Dim StartTimer

    Dim NSpace As Integer

    Dim DIR As Integer

    Dim testo As String

    Set F = Worksheets(Esempio)

    Set Stato = F.Cells(5, 5)

  • 127

    Giocare e vincere con Excel

    TIMEDELAY = 0.05 velocit di movimento

    DIR = 1

    NSpace = 1

    testo = vado a destra -->

    Do While Stato.Value

    DoEvents

    NSpace = NSpace + DIR

    F.Cells(10, 5).Value = Space(NSpace) & testo

    If NSpace < 1 Then

    DIR = -DIR

    testo = vado a destra -->

    End If

    If NSpace > 80 Then

    DIR = -DIR

    testo =

  • 128

    Giocare e vincere con Excel

    MEDELAY secondi. In questo caso il ciclo principale viene eseguito una volta ogni 0,05 secondi, cio 20 volte al secondo. Potete dunque sbizzarrirvi nella programmazione per trovare il modo mi-gliore di dare il ritmo al vostro codice, utilizzando le funzioni di Excel oppure sfruttando le API di Windows.Torniamo al ciclo principale, che a sua volta aggiunge e toglie dalla scritta uno spazio (Space(NSpace) & testo). In questo modo la scritta si sposta di uno spazio a destra o a sinistra 20 volte al secondo. Ammettendo che sul vostro monitor uno spazio abbia le dimensioni di 2 mm, la scritta si spo-ster sul vostro monitor di 2*20mm ogni secondo, cio avr una velocit di 4 cm al secondo.La Figura 7.1 rappresenta, uno sotto laltro, diversi momenti dellesecu-zione della macro per dare lidea del movimento al quale si assiste sullo schermo.

    Figura 7.1 - Il programma di gestione del timer in vari momenti della sua esecuzione.

  • 129

    Giocare e vincere con Excel

    Scriviamo un gioco interattivo: Snake

    Snake un simpatico serpente che si muove allinterno di un campo di celle dove trova ostacoli e cibo. Ogni volta che mangia un boccone di cibo, oltre a fare punti, il nostro cresce di dimensioni. Lo scopo del gioco mangiare quanto pi cibo possibile senza andare a sbattere contro gli ostacoli e senza mangiarsi la coda.Per costruire questo gioco in Excel utilizzeremo lo stesso principio visto nel labirinto: coloreremo le celle in tinte diverse a seconda del loro signi-cato. Le celle nere saranno gli ostacoli, le celle blu il cibo e le celle ama-ranto il nostro serpente che si sposta. In Figura 7.2 mostrato lo schema iniziale di gioco.

    Figura 7.2 - La posizione iniziale di Snake. Il serpente si muove da sinistra verso destra.

    Lanciando lesecuzione della macro di gioco il serpente si sposta verso destra. possibile controllare il serpente con i tasti freccia come nel-lesempio precedente no a mangiare il cibo (Figura 7.3).

    Figura 7.3 - Snake, guidato dal giocatore, si avventa sul cibo.

  • 130

    Giocare e vincere con Excel

    Il punto : come facciamo a muovere il serpente nella griglia? Il principio utilizzato qui molto semplice: se il serpente non mangia il cibo allora biso-gna colorare di amaranto la cella nella direzione in cui il serpente si muove e cancellare lultima casella della coda. Possiamo semplicemente aggiungere una casella allinizio del serpente e toglierne una alla ne: poich tutte le caselle che rappresentano il serpente sono uguali tra loro, questa procedu-ra crea lillusione che tutte le celle si spostino di una posizione nella dire-zione indicata. Il punto importante da rilevare che bisogna memorizzare le coordinate di tutte le caselle del serpente, dato che prima o poi tutte verranno cancellate. Se invece il serpente mangia qualcosa allora baster mettere una casella amaranto davanti al serpente senza cancellare lultima in fondo. Leffetto netto sar lallungamento del serpente di una casella.Per memorizzare le coordinate di tutte le caselle del serpente useremo un array circolare realizzato su un secondo foglio di supporto. Analizziamo il codice. Per prima cosa dobbiamo denire un gran numero di variabili per strutturare in modo completo il gioco (Figura 7.4).

    Figura 7.4 - Definizioni delle variabili necessarie per descrivere compiutamente il gioco.

  • 131

    Giocare e vincere con Excel

    Scorrendo le variabili si trova di tutto: le coordinate del campo di gioco sul foglio di Excel, la lunghezza del serpente, la direzione di movimento del serpente stesso, la posizione sul foglio di supporto della cella rappre-sentativa della testa e della coda, i colori del serpente e del cibo e altro ancora. Vale la regola che sempre meglio abbondare con le variabili anzich cercare di complicare il codice per metterne di meno. necessa-rio infatti che il ciclo che genera lillusione del movimento si ripeta il pi velocemente possibile, dunque al suo interno si deve evitare di effettuare calcoli per non rallentare inutilmente il codice. Tutto ci che si risparmia in termini di calcoli ripetuti si guadagna in uidit e giocabilit.Deniamo a questo punto le funzioni e le costanti per la gestione della tastiera (Figura 7.5).

    Figura 7.5 - Definizioni delle variabili necessarie per gestire linterazione con la tastiera.

    Ora inizializziamo il gioco denendo le variabili, pulendo larea di gioco, creando il nuovo serpente e collocando il cibo in una posizione casuale nellarea di gioco:

    Sub init()

    Dim i As Integer

    XStart = 4 denizione della posizione

    YStart = 7 dellarea di gioco

    XMax = 43

    YMax = 46

    Area = (XMax - XStart + 1) * (YMax - YStart + 1)

    Set S = Worksheets(S) contiene le posizioni delle caselle del serpente

    Set C = Worksheets(SNAKE) contiene larea di gioco

    Set STATUS = C.Cells(6, 3) cella contenente un valore che

  • 132

    Giocare e vincere con Excel

    indica se il gioco in corso o meno

    Set DIR = C.Cells(5, 5) cella contenente la direzione del serpente

    Set PuntiCELL = C.Cells(3, XMax + 3) cella contenente il punteggio

    Set ExtraPuntiCell = C.Cells(4, XMax + 3) cella contenente lextrapunteggio

    STATUS.Value = il gioco non in corso

    copiamo uno schema vuoto e pulito: azzeriamo larea di gioco

    Sheets(SNAKE (2)).Select

    Range(C6:AR47).Select

    Selection.Copy

    Sheets(SNAKE).Select

    Range(C6).Select

    ActiveSheet.Paste

    inzializzazione del serpente

    L = 9 lunghezza serpente iniziale

    XCoord = Int((XMax + XStart) / 2) - L

    YCoord = Int((YMax + YStart) / 2)

    denizione dei colori degli elementi del gioco

    ColorSnake = 9 colore amaranto

    ColorFood = 11 colore blu

    disegniamo il serpente

    For i = 1 To L

    S.Cells(i, 1).Value = XCoord

    S.Cells(i, 2).Value = YCoord

    C.Cells(YCoord, XCoord).Interior.ColorIndex = ColorSnake

    XCoord = XCoord + 1

    Next

    SnakeHeadX = XCoord - 1

    SnakeHeadY = YCoord

    DIR.Value = dx

    CURDIR = dx

    C.Cells(5, 5).Value = DIR

    SnakeStart = 9

    SnakeEnd = 1

    TIMEDELAY = 0.1 velocit del gioco

    inserisci cibo in una posizione casuale

    cerca una posizione che non contiene nulla prima di posizionare il cibo

    Do

  • 133

    Giocare e vincere con Excel

    XCoord = Int(((XMax - XStart + 1) * Rnd) + 1) + XStart

    YCoord = Int(((YMax - YStart + 1) * Rnd) + 1) + YStart

    Loop Until C.Cells(YCoord, XCoord).Interior.ColorIndex = xlNone

    C.Cells(YCoord, XCoord).Interior.ColorIndex = ColorFood

    Step = 0

    Punti = 0

    MaxExtraPunti = 30

    Extrapunti = MaxExtraPunti

    PuntiCELL.Value = Punti

    ExtraPuntiCell = Extrapunti

    DIR.Select

    DIR.Value = dx

    il gioco comincia!

    STATUS.Value = On

    Call snake routine di gestione del gioco

    End Sub

    Il codice molto semplice. Genera in modo coerente tutte le variabili. De-nisce e pulisce larea di gioco, posiziona il serpente da sinistra verso destra e indica che il serpente deve muoversi a destra nel prossimo passo, quindi cerca una casella vuota dove poter collocare il cibo e lo posiziona. A questo punto attiva il gioco e fa partire la routine di gestione del serpente:

    Sub snake()

    Dim Start, Delay

    Dim Moved As Boolean

    Do While STATUS.Value = On

    Start = Timer Determina listante di partenza

    Delay = Start + TIMEDELAY

    Moved = False

    Do

    If Timer > Delay Then

    If Not Moved Then

    Moved = True

    Extrapunti = Extrapunti - 1

    If Extrapunti > 0 Then

    ExtraPuntiCell.Value = Extrapunti

    Else

    ExtraPuntiCell.Value =

    Extrapunti = 0

  • 134

    Giocare e vincere con Excel

    End If

    If GetAsyncKeyState(VK_LEFT) 0 Then

    DIR.Value = sx

    ElseIf GetAsyncKeyState(VK_RIGHT) 0 Then

    DIR.Value = dx

    ElseIf GetAsyncKeyState(VK_UP) 0 Then

    DIR.Value = su

    ElseIf GetAsyncKeyState(VK_DOWN) 0 Then

    DIR.Value = giu

    End If

    Select Case DIR.Value

    Case dx

    If CURDIR sx Then

    SnakeHeadX = SnakeHeadX + 1

    CURDIR = dx

    Else

    SnakeHeadX = SnakeHeadX - 1

    CURDIR = sx

    End If

    Case su

    If CURDIR giu Then

    SnakeHeadY = SnakeHeadY - 1

    CURDIR = su

    Else

    SnakeHeadY = SnakeHeadY + 1

    CURDIR = giu

    End If

    Case giu

    If CURDIR su Then

    SnakeHeadY = SnakeHeadY + 1

    CURDIR = giu

    Else

    SnakeHeadY = SnakeHeadY - 1

    CURDIR = su

    End If

    Case sx

    If CURDIR dx Then

    SnakeHeadX = SnakeHeadX - 1

    CURDIR = sx

    Else

    SnakeHeadX = SnakeHeadX + 1

    CURDIR = dx

  • 135

    Giocare e vincere con Excel

    End If

    End Select

    SnakeStart = (SnakeStart + 1) Mod Area

    S.Cells(SnakeStart + 1, 1).Value = SnakeHeadX

    S.Cells(SnakeStart + 1, 2).Value = SnakeHeadY

    verica scontro

    If C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = 1 Or C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake Then

    STATUS.Value =

    GoTo FineGioco

    ElseIf C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorFood Then

    C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake

    inserisci cibo

    Punti = Punti + 1 + Extrapunti

    Extrapunti = Extrapunti + MaxExtraPunti

    PuntiCELL.Value = Punti

    Do

    XCoord = Int(((XMax - XStart + 1) * Rnd) + 1) + XStart

    YCoord = Int(((YMax - YStart + 1) * Rnd) + 1) + YStart

    Loop Until C.Cells(YCoord, XCoord).Interior.ColorIndex = xlNone

    C.Cells(YCoord, XCoord).Interior.ColorIndex = ColorFood

    Else

    C.Cells(S.Cells(SnakeEnd + 1, 2).Value, S.Cells(SnakeEnd + 1, 1).Value).Interior.ColorIndex = xlNone

    SnakeEnd = (SnakeEnd + 1) Mod Area

    C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake

    End If

    End If

    If GetAsyncKeyState(VK_ESCAPE) 0 Then GoTo FineGioco

    End If

    Loop Until Moved

    Loop

    FineGioco:

    temp = MsgBox(Il tuo punteggio : & Punti, vbOKOnly, Snake!)

    End Sub

  • 136

    Giocare e vincere con Excel

    Questa routine si pu dividere in pi parti. Vediamo un ciclo esterno che verica lo stato del gioco:

    Do While STATUS.Value = On

    Loop

    Al suo interno viene ripetuto indenitamente e in modo ritmico con la funzione Timer:

    Start = Timer

    Delay = Start + TIMEDELAY

    Moved = False

    Do

    If Timer > Delay Then

    End if

    Loop Until Moved

    Questo ciclo leggermente differente rispetto a quello presentato nel pa-ragrafo che descrive la funzione Timer. Il suo scopo quello di eseguire il contenuto dellif centrale una volta sola a ogni mossa, cio una sola volta per ogni incremento del timer di TIMEDELAY secondi.La variabile booleana Moved gestisce il usso del codice permettendo che lif centrale venga eseguito una volta ogni TIMEDELAY secondi. Questa parte del codice muove di un passo il serpente. Per prima cosa deve veri-care se un tasto stato premuto:

    If GetAsyncKeyState(VK_LEFT) 0 Then

    DIR.Value = sx

    ElseIf GetAsyncKeyState(VK_RIGHT) 0 Then

    DIR.Value = dx

    ElseIf GetAsyncKeyState(VK_UP) 0 Then

    DIR.Value = su

    ElseIf GetAsyncKeyState(VK_DOWN) 0 Then

    DIR.Value = giu

    End If

  • 137

    Giocare e vincere con Excel

    Il codice identico a quanto gi visto in precedenza. In questo caso il risultato dellanalisi della tastiera viene memorizzato in una cella del fo-glio di lavoro, rappresentata dalloggetto DIR (si veda la funzione Init precedente).Ora che abbiamo recuperato la direzione voluta dal giocatore, calcoliamo la nuova posizione della testa del serpente:

    Select Case DIR.Value

    Case dx

    If CURDIR sx Then

    SnakeHeadX = SnakeHeadX + 1

    CURDIR = dx

    Else

    SnakeHeadX = SnakeHeadX - 1

    CURDIR = sx

    End If

    End Select

    Il codice verica se la direzione voluta dal giocatore dx e, in questo caso, prima di modicare la direzione mandando il serpente verso destra verica che il serpente non si stia muovendo verso sinistra. In questo caso, infatti, farebbe tornare il serpente sui suoi passi, il che non concesso dal gioco: solo se la direzione attuale non sx gira il serpente nella dire-zione dx, altrimenti lo lascia proseguire verso sx. Lo stresso identico controllo viene eseguito per le altre tre direzioni.Memorizziamo ora la nuova posizione della testa nellarray circolare:

    SnakeStart = (SnakeStart + 1) Mod Area

    S.Cells(SnakeStart + 1, 1).Value = SnakeHeadX

    S.Cells(SnakeStart + 1, 2).Value = SnakeHeadY

    La funzione Mod consente di realizzare larray corcolare senza sforzo. Con questo comando SnakeStart si incrementa sempre di uno; quando rag-giunge la dimensione massima (Area) allora ricomincia da 0 restando sem-pre connato tra i valori 0 e Area-1. Le coordinate della testa del serpente verranno memorizzate nelle celle con riga da 1 a Area.

  • 138

    Giocare e vincere con Excel

    Verichiamo lo scontro della testa con un ostacolo (colore 1) o con se stesso:

    If C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = 1 Or C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake Then

    STATUS.Value =

    GoTo FineGioco

    In questo caso annulliamo lo stato del gioco e terminiamo la partita por-tando lesecuzione alla posizione del codice indicata con FineGioco.In caso contrario (il serpente non morto) verichiamo se cera del cibo nella posizione ora occupata dalla testa:

    ElseIf C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorFood Then

    In questo caso il codice colora il cibo con la tinta della testa (il serpente man-gia il cibo), incrementa il punteggio e inserisce un nuovo boccone di cibo:

    C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake

    inserisci cibo

    Punti = Punti + 1 + Extrapunti

    Extrapunti = Extrapunti + MaxExtraPunti

    PuntiCELL.Value = Punti

    Do

    XCoord = Int(((XMax - XStart + 1) * Rnd) + 1) + XStart

    YCoord = Int(((YMax - YStart + 1) * Rnd) + 1) + YStart

    Loop Until C.Cells(YCoord, XCoord).Interior.ColorIndex = xlNone

    C.Cells(YCoord, XCoord).Interior.ColorIndex = ColorFood

    Inne, se il serpente non si scontrato con gli ostacoli o con se stesso e non ha mangiato cibo, signica che si mosso in una casella vuota. Dun-que bisogna semplicemente spostarlo di una casella cancellando lultimo pezzo di coda:

    Else

    C.Cells(S.Cells(SnakeEnd + 1, 2).Value, S.Cells(SnakeEnd + 1, 1).Value).Interior.ColorIndex = xlNone

  • 139

    Giocare e vincere con Excel

    SnakeEnd = (SnakeEnd + 1) Mod Area

    C.Cells(SnakeHeadY, SnakeHeadX).Interior.ColorIndex = ColorSnake

    End If

    In tutto questo giro le variabili SnakeEnd e SnakeStart tengono traccia del-le coordinate della testa e della coda allinterno dellarray circolare.La routine di gestione del serpente terminata. In essa vi anche la ge-stione della variabile ExtraPunti, di cui non abbiamo parlato. Lasciamo al lettore la curiosit di vericare direttamente sul gioco qual lo scopo di questa variabile.

    Migliorare la graca con gli sprite

    Il gioco Snake che abbiamo appena costruito, pur essendo perfettamente funzionante, ha un grave difetto: la graca orribile. Il gioco si realizza con caselle di Excel che si colorano di amaranto, blu e nero. La testa del serpente identica alla coda; si intuisce la differenza tra testa e coda solo guardando il movimento. La graca, insomma, ricorda i primi videogiochi degli anni Settanta. Per fortuna con Excel si pu fare di meglio! In que-sta parte del capitolo vedremo come fare in modo che in Excel possano vedersi astronavi che sfrecciano, palle che rotolano e omini che saltano con la stessa qualit graca che abbiamo visto nel Pacman del capitolo precedente.Per dare lillusione di un movimento uido degli oggetti si utilizza anco-ra una volta la logica del cinema o, per rendere meglio lidea, lo stesso principio dei libretti dei bambini con le immagini in movimento. Sono libretti con tante pagine ognuna delle quali rappresenta un oggetto in una posizione leggermente differente; sfogliando velocemente il libretto si vedono si ha limpressione di un oggetto in movimento. Nel linguag-gio dei videogiochi, ognuna delle immagini che rappresenta loggetto in pose leggermente diverse detta sprite. Per muovere gli oggetti dovre-mo generare una sequenza di immagini (sprite) della stessa dimensione e leggermente differenti luna dallaltra.Per farlo in Excel, per prima cosa dobbiamo avere uno spazio adeguato dove rappresentare gli oggetti: dimensioniamo tutte le colonne a una larghezza di 0,42 e tutte le righe a unaltezza di 8, in modo che appaiano

  • 140

    Giocare e vincere con Excel

    quadrate sullo schermo, e riduciamo lo zoom al 10%. In questo modo ogni singola cella diventata molto piccola e si confonde con i pixel dello schermo. Sfrutteremo proprio questa confusione per utilizzare aree di 30x30 celle e realizzare immagini che appariranno sullo schermo di di-mensioni 30x30 pixel. Coloreremo lo sfondo di ogni singola cella come se fosse un pixel di unimmagine.Per dare lillusione del movimento ora sufciente creare tanti sprite dello stesso oggetto leggermente differenti luno dallaltro e scrivere una macro che sostituisce gli sprite velocemente sul foglio di Excel. Se studiamo con attenzione lo zoom del foglio e le dimensioni delle righe e delle colonne, il risultato sar molto piacevole.Vediamo, per esempio, come far rotolare una palla colorata sul foglio di Excel. In Figura 7.6 potete osservare il foglio di lavoro ridotto a dimensio-ni minuscole e la palla disegnata su di esso colorando ad arte le celle.

    Figura 7.6 - Esempio di pallina generata su un gruppo di celle Excel ridotte a dimensioni minimali.

    Il risultato ottimo se confrontato con Snake. Si noti che la dimensione della visualizzazione delle celle stata ridotta al 10%. Ingrandiamo larea della pallina per vericare come realizzata (Figura 7.7).Come risulta evidente, le singole caselle sono state dimensionate in modo da apparire quadrate sullo schermo e colorate per formare una pallina dalle dimensioni di 30x30 pixel.Passiamo ora alla seconda fase: far rotolare la pallina sullo schermo: come si detto sono sufcienti alcune immagini differenti per le diverse posizio-ni della pallina stessa durante il rotolamento (Figura 7.8).

  • 141

    Giocare e vincere con Excel

    Figura 7.7 - Lo stesso foglio di lavoro dellimmagine

    precedente ingrandito per mostrare i dettagli

    di realizzazione della pallina.

    Figura 7.8 - Le varie posizioni della pallina durante il rotolamento.

    Tante pi immagini differenti si realizzano, tanto pi il movimento apparir uido e senza scatti. Questo comporter per uno sforzo di progettazione delle immagini maggiore. Inserendo le palline di Figura 7.8 in un foglio di supporto e scrivendo una macro che sostituisce velocemente le immagini sul campo di gioco otterremo leffetto del rotolamento. Il codice il seguente:

    Dim P As Worksheet

    Dim C As Worksheet

    Dim Pallina As Range

    Dim Dest As Range

    Dim Nulla As Range

    Dim X As Long

    Dim Y As Long

    Dim L As Integer

    Dim H As Integer

    Dim Ogni As Integer

    Sub Muovi_SPRITE()

  • 142

    Giocare e vincere con Excel

    Dim Start

    Dim Img As Integer

    Dim passi As Long

    Dim VarPassi As Integer

    Dim Vx As Integer

    Dim Vy As Integer

    Dim OldImg As Integer

    Dim TIMEDELAY As Double

    On Error GoTo ErrH

    Application.EnableCancelKey = xlErrorHandler

    TIMEDELAY = 0.012

    Ogni = 6

    Cells.Select

    Selection.Interior.ColorIndex = 1

    Range(A1).Select

    Set P = Worksheets(Pallina)

    Set C = Worksheets(Campo)

    X = 100

    Y = 100

    L = 31

    H = 30

    Vx = 1

    Vy = -1

    Set Pallina = P.Cells(1 + 35 * SPRITE, 2).Resize(L, H)

    Set Nulla = P.Cells(1, 90).Resize(L, H)

    Set Dest = C.Cells(Y, X).Resize(L, H)

    Pallina.Copy Destination:=Dest

    passi = 1

    VarPassi = 1

    OldImg = 1

    Do While True

    passi = passi + VarPassi

    Img = (passi \ Ogni) Mod 18

    If Img OldImg Then

    Set Pallina = P.Cells(1 + 35 * Img, 2).Resize(L, H)

    OldImg = Img

    End If

    Nulla.Copy Destination:=Dest

    X = X + Vx

    Y = Y + Vy

    If X > 220 Then Vx = -Vx

    If X < 5 Then Vx = -Vx

    If Y < 5 Then Vy = -Vy

    If Y > 500 Then Vy = -Vy

    Set Dest = C.Cells(Y, X).Resize(L, H)

  • 143

    Giocare e vincere con Excel

    Pallina.Copy Destination:=Dest

    Start = Timer Determina listante di partenza

    Do While Timer < Start + TIMEDELAY

    Loop

    Loop

    ErrH:

    Temp = MsgBox(Uscire dalla rountine?, vbYesNo, Pallina!!!)

    If Temp = vbNo Then Resume Next

    End Sub

    Ancora una volta, la prima parte del codice dedicata alla denizione delle variabili necessarie.Il tutto inserito in una routine Muovi_SPRITE, che utilizza il foglio denito come P per recuperare le varie immagini della pallina in posizioni diver-se e il foglio C come campo di gioco della pallina nel suo rotolamento.Si utilizzano tre variabili:

    Pallina per denire linsieme (range) di celle che contiene limma-gine corrente della pallina;

    Nulla per denire unarea delle medesime dimensioni della pre-cedente ma contenente solo celle senza colore;

    Dest per denire il range di celle che conterr la pallina sul cam-po di gioco.

    Lalgoritmo, in estrema sintesi, colora Dest alternativamente con i colori presenti nei range rappresentati da Pallina e da Nulla per generare leffet-to di rotazione. Contemporaneamente, sposta le coordinate di Dest per trasformare la rotazione in rotolamento.Per sostituire rapidamente i colori da un gruppo di celle a un altro si sono sfruttati i comandi:

    Pallina.Copy Destination:=Dest

    Nulla.Copy Destination:=Dest

    Che copiano rispettivamente il contenuto di Pallina e di Nulla in Dest.

  • 144

    Giocare e vincere con Excel

    Per muovere la Pallina si utilizzano due variabili Vx e Vy che rappresen-tano la velocit lungo gli assi X e Y della pallina stessa. Quando la pal-lina raggiunge i bordi del campo di gioco, la routine inverte Vx o Vy costringendola a ritornare verso il centro del campo. Il risultato una pallina che rimbalza da tutte le parti mentre, sostituendo rapidamente le immagini della pallina stessa ad angoli differenti, si ha limpressione che rotoli.La Figura 7.9 rappresenta la posizione della pallina in istanti successivi del-lesecuzione della macro. La freccia indica il movimento compiuto dalla pal-lina, che rimbalza sul bordo dellarea di lavoro mentre ruota su se stessa.

    Figura 7.9 - Alcuni momenti dellesecuzione della macro.

    Per terminare la descrizione dellalgoritmo si inserito il ciclo di ritardo per dare il ritmo al codice:

    Do While Timer < Start + TIMEDELAY

    Loop

    Migliorare la graca con le immagini

    Latra tecnica che si pu sfruttare per gestire una graca accattivante in Excel quella suggerita da Carlos Rondo sul suo sito www.cyberbolsa.cea.ucp.pt/informatica/download. Carlos utilizza la tecnica degli shapes. In un foglio di Excel possibile collocare vari oggetti oltre a formule e

  • 145

    Giocare e vincere con Excel

    scritte. A noi interessa inserire unimmagine con il comando Inserisci > Immagine > Da le (Figura 7.10).

    Figura 7.10 - Il comando per inserire unimmagine in un file di Excel.

    Una volta selezionata, limmagine essa apparir nella cartella di lavoro e far parte integrante del foglio. Sar tanto integrata che Excel stesso le dar un nome, come mostrato in Figura 7.11.

    Figura 7.11 - Immagine inserita e nominata automaticamente da Excel.

    La faccina che sorride inserita nel foglio e Excel le ha assegnato il nome Immagine 1. A questo punto potete rinominare limmagine come me-glio credete. Poich tale oggetto ha un nome, possibile riferirsi a esso allinterno del codice VBA:

    Sub sposta_faccina()

    Worksheets(Foglio1).Shapes(Immagine 1).Top = 50

  • 146

    Giocare e vincere con Excel

    Worksheets(Foglio1).Shapes(Immagine 1).Left = 200

    Worksheets(Foglio1).Shapes(Immagine 1).IncrementRotation 30

    End Sub

    Il codice dice di spostare langolo in alto a sinistra dellimmagine (Top, Left) alle coordinate 50,200 e di ruotare limmagine di 30 in senso orario. Il risultato mostrato in Figura 7.12.

    Figura 7.12 - Limmagine manipolata dal codice VBA.

    anche possibile sfruttare (come Carlos fa nelle sue macro) le coordinate delle celle di Excel. Si possono recuperare nel codice VBA le coordinate dellangolo in alto a sinistra di una specica cella attraverso i comandi:

    Sub sposta_faccina2()

    T = Worksheets(Foglio1).Cells(4, 5).Top

    L = Worksheets(Foglio1).Cells(4, 5).Left

    Worksheets(Foglio1).Shapes(Immagine 1).Top = T

    Worksheets(Foglio1).Shapes(Immagine 1).Left = L

    End Sub

    Si ottiene cos il risultato di Figura 7.13, dove limmagine si sovrappone alla cella.

  • 147

    Giocare e vincere con Excel

    Figura 7.13 - Il posizionamento dellimmagine dipende

    dalle coordinate della cella.

    Attraverso questa tecnica possibile evitare di colorare una cella (come abbiamo fatto nellesempio di Snake) e inserire invece unimmagine che la copra perfettamente. Tale immagine rappresenter una pallina, un mo-stro, un insetto. Questa tecnica utilizzata magistralmente da Carlos Ron-do nel suo gioco Snake, dove le immagini che si sovrappongono alle celle sono i vari segmenti del serpente.Vediamo ora un esempio di un codice che muove unimmagine inserita in un foglio Excel. Si tratta di una piccola pallina che ruota intorno a un centro; con i tasti Freccia destra e Freccia sinistra possibile modicare la distanza della pallina stessa dal centro per farle compiere delle spirali (Figura 7.14).

    Figura 7.14 - Immagine di una palla che gira in tondo sul foglio di Excel.

  • 148

    Giocare e vincere con Excel

    La palla che deve girare per il foglio di lavoro stata nominata PALLA. Il codice che la fa muovere il seguente:

    Option Explicit

    Declare Function GetAsyncKeyState Lib User32.dll (ByVal vKey As Long) As Long

    Const VK_LEFT As Long = 37

    Const VK_DOWN As Long = 40

    Const VK_RIGHT As Long = 39

    Const VK_UP As Long = 38

    Const VK_Z As Long = 90

    Const VK_SHIFT As Long = 16

    Sub muovi_PALLA()

    Dim a As Double

    Dim TIMETOT As String

    Dim T, TInit, TStep

    Dim step As Integer

    Dim Direzione As String

    Dim raggio As Integer

    Direzione =

    raggio = 60

    TIMETOT = 1

    T = 0.03

    TInit = Timer

    a = 0

    step = 2

    While Timer < TInit + TIMETOT

    DoEvents

    Application.Interactive = False

    If GetAsyncKeyState(VK_LEFT) 0 Then

    Direzione = Sinistra

    raggio = raggio - 1

    If raggio < 10 Then raggio = 10

    ElseIf GetAsyncKeyState(VK_RIGHT) 0 Then

    Direzione = Destra

    raggio = raggio + 1

    If raggio > 100 Then raggio = 100

    Else

    Direzione =

    End If

    Cells(1, 1) = Direzione

    Cells(3, 13) = raggio

    a = a + 2 * 3.141592 / 360 * step

  • 149

    Giocare e vincere con Excel

    Worksheets(Sheet1).Shapes(PALLA).Top = Round(150 + Sin(a) * raggio)

    Worksheets(Sheet1).Shapes(PALLA).Left = Round(150 + Cos(a) * raggio)

    TStep = Timer

    While Timer < TStep + T

    Wend

    Wend

    Application.Interactive = True

    End Sub

    Il codice basato su un ciclo esterno di venti secondi regolabile con la variabile TIMETOT. Lanimazione, dunque, durer venti secondi; in questo tempo verr eseguita continuativamente la parte interna del ciclo che muove la palla sullo schermo. La sua velocit di movimento regolata attraverso un ciclo di ritardo dalla variabile T.Nel ciclo while-wend vengono eseguite le seguenti azioni:

    verica della pressione dei tasti. Se sono state premuti i tasti Frec-cia destra e sinistra viene modicato il raggio del cerchio;

    si calcola il nuovo angolo e si sposta la PALLA nella nuova posizione.Per visualizzare il movimento della palla si utilizza il comando DoEvents, che consente a Excel di aggiornare la posizione della palla sullo scher-mo. Tale istruzione, per, permette anche allutente di spostare il cursore, di inserire testi nelle celle, di interagire insomma con Excel esattamente come se la macro non ci fosse. Questo comporta un problema di gestione dellinterfaccia di importanza cruciale. quindi necessario permettere a Excel di eseguire gli eventi (dunque di spostare loggetto) ma bisogna inibire linterattivit con lutente. Listruzione:

    Application.Interactive = False

    ha esattamente questo scopo. Attenzione: se eseguite una macro con questa istruzione e non eseguite listruzione:

    Application.Interactive = True

    che riporta le cose alla normalit, non potrete pi interagire con Excel!

  • 150

    Giocare e vincere con Excel

    Lunica alternativa che avrete a questo punto chiudere Excel da Program Manager e ovviamente perdere tutto ci che non era stato salvato. Fate quindi molta attenzione quando usate questi comandi ed evitate che la macro si interrompa a met! In questo caso, infatti, sar stato eseguito il comando:

    Application.Interactive = False

    ma non la sua controparte e dunque, anche se il codice fosse stato corret-to, si avrebbe comunque la perdita della sessione aperta. Ci sono anche altri due modi per ottenere lo stesso risultato. La prima alternativa, meno piacevole dal punto di vista dellesperienza di gioco, quella di eliminare i comandi:

    DoEvents; Application.Interactive = True; Application.Interactive = False.

    e inserire al loro posto il comando Application.ScreenUpdating = True allinterno del ciclo while-wend. Questa istruzione esegue un refresh di tut-to lo schermo (e non solo della palla) producendo un risultato analogo a DoEvents, ma con lo svantaggio che limmagine diventa leggermente tre-molante. Il vantaggio che non si rischia di perdere il controllo di Excel.Laltra possibilit che ci sentiamo di consigliare per la gestione della ta-stiera quella di lasciare il comando DoEvents senza per i due comandi Application.Interactive. In questa situazione lutente pu spostare il cur-sore tra le celle liberamente come se la macro non stesse funzionando. Si gestisce allora levento Worksheet_SelectionChange del foglio di lavoro per riportare sempre il cursore nella stessa cella (in questo caso E3):

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Range(E3).Activate

    End Sub

    Questo codice non deve essere inserito in un modulo ma nel foglio di lavoro nel quale si trova la palla (o il gioco da gestire) facendo doppio clic sul nome del foglio nellarea del progetto di Figura 1.1.

  • 151

    Giocare e vincere con Excel

    Anche questo metodo ha vantaggi e svantaggi: il vantaggio, ancora una volta, che non si rischia di perdere il controllo di Excel; lo svantaggio che anche quando la macro non funziona levento Worksheet_Selection-Change viene eseguito e il cursore resta incastrato sempre nella cella E3. La soluzione si complica, allora, perch bisogna avere una cella del foglio di lavoro controlli se la macro sia attivata o meno. Solo sapendo se la macro in funzione possibile denire il comportamento dellevento in-criminato, lasciando libero il cursore quando la macro inattiva e invece incastrando il cursore quando la macro attiva:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Cells(2, 2) = On Then Range(E3).Activate

    End Sub

    Ovviamente la cella (2,2) viene posta a On allinizio della macro (cells(2,2)=On) e azzerata (Cells(2,2)=) al termine della stessa. A voi resta solo la scelta di quale tecnica sia meglio utilizzare tra quelle esposte.Con poche modiche al codice, seguendo la falsa riga di quanto fatto per gli sprite, potrete persino gestire le immagini in movimento: come per gli sprite, cos per le immagini basta creare una sequenza di immagini legger-mente diverse le une dalle altre, e periodicamente sostituire nella posizio-ne delloggetto le immagini che lo costituiscono. Leffetto assicurato!

    Immagini 3D

    Per utilizzare una graca tridimensionale sul proprio foglio di Excel neces-sario gestire moltissime informazioni riguardo alla scena che si vuole rappre-sentare, a partire dal punto di vista e dalle posizioni nello spazio tridimen-sionale dei vertici di tutte le gure che si devono proiettare sullo schermo. Oltre a una base di dati molto complessa dove tracciare tutte le informazio-ni riguardanti la scena, necessaria anche una discreta potenza di calcolo. Proprio per questo motivo, i giochi tridimensionali pi affermati utilizzano delle librerie grache, che consentono di sfruttare appieno la potenza degli acceleratori presenti in tutte le moderne schede video. La mole di calcoli e la velocit necessarie per rendere un effetto realistico non consentono di realizzare gli stessi effetti semplicemente utilizzando il VBA di Excel.

  • 152

    Giocare e vincere con Excel

    invece possibile creare e gestire su un foglio di lavoro degli oggetti tri-dimensionali sfruttando le caratteristiche grache del programma.Lesempio che segue ancora una volta basato su unidea di Carlos Ron-do. Si tratta di utilizzare le forme di Excel e di aggiungere a queste la ter-za dimensione mediante lutilizzo della barra dei comandi Impostazioni 3D, attivabile con un pulsante a partire dalla barra Disegno.

    Figura 7.15 - La barra Impostazioni 3D.

    Si parte disegnando una forma qualsiasi (per esempio un rettangolo) e attraverso la barra Impostazioni 3D si aggiunge la terza dimensione, si imposta la direzione di illuminazione e lo spessore delloggetto. Con po-chi e semplici passaggi si ottiene loggetto rappresentato in Figura 7.16.

    Figura 7.16 - Un rettangolo a cui stata aggiunta

    la terza dimensione per renderlo

    un parallelepipedo.

    In Figura 7.17 sono invece mostrate alcune delle opzioni congurabili nel-la barra Impostazioni 3D. Ovviamente le capacit di Excel nella rappresentazione di oggetti 3D sono limitate, ma comprendono tutti gli elementi di base per costruire strutture

  • 153

    Giocare e vincere con Excel

    interessanti e gradevoli. In queste pagine vedremo solo come muovere questi oggetti, lasciando al lettore il compito di inventare nuovi modi per utilizzare questa tecnica al ne di creare immagini pi complesse.

    Figura 7.17 - Alcune opzioni per le impostazioni 3D.

    Vediamo ora il codice per muovere la scatola appena costruita. La pre-messa fondamentale per comprendere il codice che al parallelepipedo stato associato il nome gura.Il codice costituito da due elementi:

    il primo si trova allinterno del modulo Modulo1; il secondo associato ai pulsanti e risiede sicamente allinterno

    dello spazio del codice associato al foglio di lavoro Foglio1.Vediamo il codice presente in Modulo1; si noti sulla sinistra (Figura 7.18) che il Modulo1 evidenziato come attivo.

  • 154

    Giocare e vincere con Excel

    Figura 7.18 - La prima parte del codice.

    Il codice presenta una prima parte di dichiarazione che denisce tre variabili: langolo di rotazione lungo lasse X (RotX); langolo di rotazione lungo lasse Y (RotY); una variabile di controllo del usso della macro (FINECOMPITO).

    Queste variabili saranno utilizzate sia nel codice sottostante sia nella se-conda parte del codice.La procedura CliccaFigura() chiamata ogni volta che con il mouse si fa clic con il pulsante sinistro sulla scatola in movimento. Questa procedura gestisce linterattivit con lutente. La procedura cambia verso di rotazio-ne sia sullasse X sia sullasse Y e modica il colore della gura (.Fill.Fo-reColor.SchemeColor), facendo ruotare i colori tra il codice 2 e il codice 8. Si noti luso del comando with per evitare di ripetere a ogni riga il codice ActiveSheet.Shapes(NomeShape).Per fare in modo che a ogni clic sulla gura corrisponda lesecuzione della macro CliccaFigura() bisogna associare alla gura stessa la macro come mostrato in Figura 7.19.

  • 155

    Giocare e vincere con Excel

    Figura 7.19 - Alla figura deve essere associato il codice che permette linterazione con lutente.

    Vediamo ora la seconda parte del codice, che esegue effettivamente la rotazione della gura.

    Figura 7.20 - La parte del codice che esegue la rotazione della figura.

  • 156

    Giocare e vincere con Excel

    Per prima cosa notiamo che questa parte si trova allinterno di Foglio1. Questo per mostrare come non sia necessario creare un modulo ogni vol-ta che si inserisce del codice.Il codice inserito in questo spazio pu essere attivato anche a seguito di eventi che avvengono allinterno del foglio di lavoro. Ogni volta che si compie unazione su un foglio, come spostare il cursore, modicare una cella, fare clic con il mouse e cos via, Excel va a vericare allinterno di questo spazio se esiste una porzione di codice corrispondente allevento. Nel caso la trovi, la esegue allistante. Nel nostro esempio abbiamo sfrut-tato questa funzionalit.I due pulsanti che compaiono nel foglio di lavoro sono stati nominati INI-ZIO e FINE. Al clic sul pulsante INIZIO viene eseguita la porzione di codice identicata allinterno della procedura Private Sub INIZIO_Click(). Alla pressione del pulsante FINE viene invece eseguita la porzione di codice presente nella procedura Private Sub FINE_Click().La procedura INIZIO_Click() denisce la variabile FINECOMPITO a False e poi entra in un ciclo innito, dato che allinterno di tale ciclo non viene mai modicato il valore della variabile FINECOMPITO che consente di terminare il ciclo stesso. La variabile viene invece modicata da FINE_Click().La domanda che ci dobbiamo porre : ma se sono allinterno del ciclo innito di INIZIO_Click(), quando viene eseguita la routine FINE_Cli-ck()? Questo mistero si risolve pensando con una logica di esecuzione del codice non sequenziale ma a eventi: la routine di FINE viene eseguita al momento del clic sul pulsante corrispondente, interrompendo lesecu-zione del ciclo innito. A questo punto, terminata la gestione dellevento FINE_Click(), lesecuzione del codice riprender il ciclo innito di INI-ZIO_Click(), ma ora la variabile FINECOMPITO ha cambiato stato e dunque il ciclo non sar pi innito, ma terminer anchesso.La garanzia che si possa fare clic sul pulsante FINE data dal fatto che al-linterno della gestione di INIZIO appare il comando DoEvents, che rende appunto possibile il gioco degli eventi appena descritto.Passiamo ora allanalisi del codice. Il codice permette di ruotare la scatola lungo tutti e tre gli assi con i comandi:

    .IncrementRotation per lasse Z; .ThreeD.RotationX per lasse X;

  • 157

    Giocare e vincere con Excel

    .ThreeD.RotationY per lasse Y.Il codice in se molto semplice in quanto ruota la scatola lungo i tre assi a ogni ciclo e poi attende un decimo di secondo prima di eseguire la suc-cessiva rotazione. In questo tempo Excel si mette in ascolto dellutente con listruzione DoEvents, mentre lutente pu fare clic su FINE oppure sulla scatola stessa. Nel primo caso interrompe la rotazione, mentre nel secon-do fa eseguire la routine CliccaFigura() cambiando il colore alla scatola e il senso di rotazione.In Figura 7.21 potete apprezzare varie posizioni e colori della scatola du-rante lesecuzione della macro.

    Figura 7.21 - Alcuni momenti dellesecuzione della macro.

    E adesso, la palla passa a voi!

    Abbiamo descritto tutti gli elementi di base per la costruzione di un gioco interattivo. Il prossimo passo, che lasciamo al lettore, quello di combina-re gli sprite o la gestione delle immagini con la gestione dellinterattivit per costruire un gioco avvincente con una graca accattivante.Sul sito collegato al libro potrete trovare gli esempi di queste pagine. Vi invitiamo a scaricare il le Excel contenente la pallina colorata dellesem-pio degli sprite e di concepire un vostro gioco per Excel. Potreste realiz-zare, per esempio:

    un gioco di ping-pong;

  • 158

    Giocare e vincere con Excel

    il gioco del muretto; una simulazione di una pallina elastica che rimbalza su un pavimento; una simulazione del pianeta Terra che ruota attorno al Sole; un gioco dove la pallina magnetizzata e attratta dagli altri ele-

    menti del campo di gioco; qualsiasi altra cosa vi venga in mente!

    Gli autori sono a vostra disposizione per raccogliere i vostri giochi e inse-rirli nei propri siti Web (www.excelling.it e www.terzaghi.it), nelle pagine dedicate a questo libro, citandovi come autori del gioco.A questo punto, possiamo solo augurarvi buon divertimento!

    Risorse sul Web

    Per informazioni riguardo alle API e alla funzione di gestione della tastiera cercate sul sito ufciale di Microsoft:

    documentazione sulle API: http://msdn.microsoft.com/library/de-fault.asp?url=/library/en-us/winprog/winprog/overview_of_the_windows_api.asp;

    gestione della tastiera: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/use-rinput/keyboardinput/keyboardinputreference/keyboardinputfunc-tions/getasynckeystate.asp;

    elenco dei codici dei tasti virtuali: http://msdn.microsoft.com/li-brary/default.asp?url=/library/en-us/winui/winui/WindowsUserIn-terface/UserInput/VirtualKeyCodes.asp;

    la funzione per determinare il numero di millisecondi trascorsi: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/gettickcount.asp;

    il sito di Carlos Rondo: www.cyberbolsa.cea.ucp.pt/informatica/download.