Il gioco Snake che abbiamo appena costruito, pur essendo perfettamente funzionante, ha un grave difetto: la grafica è 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 grafica, insomma, ricorda i primi videogiochi degli anni Settanta. Per fortuna con Excel si può fare di meglio! In questa 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à grafica che abbiamo visto nel Pacman del capitolo precedente. Per dare l’illusione di un movimento fluido degli oggetti si utilizza ancora una volta la logica del cinema o, per rendere meglio l’idea, 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 l’impressione di un oggetto in movimento. Nel linguaggio dei videogiochi, ognuna delle immagini che rappresenta l’oggetto in pose leggermente diverse è detta sprite. Per muovere gli oggetti dovremo generare una sequenza di immagini (sprite) della stessa dimensione e leggermente differenti l’una dall’altra. 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 un’altezza di 8, in modo che appaiano 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 dimensioni 30x30 pixel. Coloreremo lo sfondo di ogni singola cella come se fosse un pixel di un’immagine. Per dare l’illusione del movimento è ora sufficiente creare tanti sprite dello stesso oggetto leggermente differenti l’uno dall’altro 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 4 potete osservare il foglio di lavoro ridotto a dimensioni minuscole e la palla disegnata su di esso colorando ad arte le celle.  Figura 4 – Esempio di pallina generate 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 l’area della pallina per verificare come è realizzata (Figura 5). 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 sufficienti alcune immagini differenti per le diverse posizioni della pallina stessa durante il rotolamento (Figura 6). Figura 5 – Lo stesso foglio di lavoro dell’immagine precedente ingrandito per mostrare i dettagli di realizzazione della pallina Figura 6 – Le varie posizioni della pallina durante il rotolamento. Tante più immagini differenti si realizzano, tanto più il movimento apparirà fluido e senza scatti. Questo comporterà però uno sforzo di progettazione delle immagini maggiore. Inserendo le palline di Figura 6 in un foglio di supporto e scrivendo una macro che sostituisce velocemente le immagini sul campo di gioco otterremo l’effetto 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()
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)
Pallina.Copy Destination:=Dest
Start = Timer ‘Determina lʼistante 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 definizione delle variabili necessarie. Il tutto è inserito in una routine Muovi_SPRITE, che utilizza il foglio definito come “P” per recuperare le varie immagini della pallina in posizioni diverse e il foglio “C” come campo di gioco della pallina nel suo rotolamento. Si utilizzano tre variabili: | • | • “Pallina” per definire l’insieme (range) di celle che contiene l’immagine corrente della pallina; | | • | • “Nulla” per definire un’area delle medesime dimensioni della precedente ma contenente solo celle senza colore; | | • | • “Dest” per definire il range di celle che conterrà la pallina sul campo di gioco. |
L’algoritmo, in estrema sintesi, colora Dest alternativamente con i colori presenti nei range rappresentati da Pallina e da Nulla per generare l’effetto 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. Per muovere la Pallina si utilizzano due variabili Vx e Vy che rappresentano la velocità lungo gli assi X e Y della pallina stessa. Quando la pallina 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 l’impressione che rotoli. La Figura 7 rappresenta la posizione della pallina in istanti successivi dell’esecuzione della macro. La freccia indica il movimento compiuto dalla pallina, che rimbalza sul bordo dell’area di lavoro mentre ruota su se stessa. Figura 7 – Alcuni momenti dell’esecuzione della macro Per terminare la descrizione dell’algoritmo si è inserito il ciclo di ritardo per dare il ritmo al codice:
Do While Timer < Start + TIMEDELAY
Loop
 | Gianclaudio Floria - Autore top seller su Excel per Edizioni FAG, collabora con Microsoft ed è il fondatore del portale www.excelling.it Andrea Terzaghi - Ingegnere con esperienza pluriennale nell'uso lavorativo e ludico di Excel; condivide trucchi e segreti sul suo sito www.terzaghi.it
Articolo tratto da:
Gianclaudio Floria, Andrea Terzaghi, Giocare e vincere con Excel, Assago (Milano), FAG, 2006. |
| |