Amstrad CPC: I tiles

Creiamo il nostro livello di gioco

Benvenuti al terzo capito sulla programmazione in Basic dell’Amstrad CPC, computer che ricordiamo, essere molto presente in Francia, Spagna ed Inghilterra nella seconda metà degli anni ’80.

Nei capitoli precedenti, abbiamo visto come disegnare a video un elemento grafico formato da tanti pixel (un carattere nel nostro caso), come muoverlo con la pressione di tasti freccia ed un primo accenno alla gestione dell’input da tastiera.

Oggi parleremo di Tiles, ovvero blocchi grafici di dimensione variabile o uguale (nel nostro caso) che costituiscono un fondale fisso o in movimento (scrolling).
Un esempio immediato è sicuramente il gioco Super Mario Bros per Nintendo NES o Famicom.
Il livello costituito da tante piattaforme, altro non sono che “Tiles” e costituiscono il cosidetto “background” di gioco.
Ogni Tile con relativi attributi, viene posizionato in uno spazio ben preciso in un’area di memoria per poi venire elaborato ad ogni ciclo.

LA MAPPA

Come detto prima, i tiles vengono posizionati all’interno di un’area che chiameremo “Mappa” e che, generalmente, è costituita da un Array multidimensionale.

Immaginiamo di voler identificare con il valore numerico 1 i muri del nostro gioco e con 0, l’area dove invece cammineremo.
andremo a costruire un array simile a questo:

Data 1,0,0,0,0,0,1
Data 1,0,0,0,0,0,1
Data 1,0,0,0,0,0,1
Data 1,1,1,1,1,1,1

Come possiamo notare dallo schema, abbiamo una “mappa” visivamente simile alla Battaglia Navale, ricordate?

Come si gioca a Battaglia Navale?

Ogni giocatore posiziona nella mappa (solitamente raffigurante il mare) le proprie navi e a turno, comunica all’alto le coordinate (X e Y) di lancio.
– “… A5!….”

– “Affondato!!” (di solito con una serie di imprecazioni a seguire).

Una cosa simile avviene anche per il disegno del nostro livello di gioco, andando a specificare al nostro programma dove posizione i singoli “tile”.
Solitamente viene creato un ciclo “for – next” per l’asse delle ascisse (X) ed uno ciclo per le ordinate (Y):

1 cls: DIM map(7,4)
2 For y=1 to 4
3 For x=1 to 7
4 read a:map(x,y)=a
5 Next
6 Next

7 DATA 1,0,0,0,0,0,1
8 DATA 1,0,0,1,1,0,1
9 DATA 1,0,0,1,0,0,1
10 DATA 1,1,1,1,1,1,1

Esecuzione del programma

– Alla linea 1 cancello (CLS) lo schermo e DIMensiono (dedico un’area di memoria definita) la mappa che andremo a creare; lunga 7 celle ed alta 4.
(Esattamente come accade quando disegniamo sul foglio la nostra griglia per giocare a battaglia navale).

– Alla linea 2 andremo a leggere ogni singola informazione nell’array map, nell’asse delle ordinate da 1 a 4
– Alla linea 3 andremo a leggere ogni singola informazione nell’array map, nell’asse delle ascisse da 1 a 7
– Alla lina 4 leggeremo (READ) tutte le informazioni (mettendolo in a) che arriveranno dai DATA e le posizionadole nel nostro array map, ovvero la nostra mappa. In pò come quando mettiamo le navi prima della battaglia.

Eseguendo avremo un’elaborazione simile a questa:

– leggi il primo numero dentro ai DATA e mettilo in map alle coordinate x 1, y 1 (quindi trovermo 1)
– leggi il secondo numero dentro ai DATA e mettilo in map alle coordinate  x 2, y 1 (quindi trovermo 0)
– leggi il terzo numero dentro ai DATA e mettilo in map alle coordinate  x 3, y 1 (quindi trovermo 0)
– leggi il quarto numero dentro ai DATA e mettilo in map alle coordinate x 4, y 1 (quindi trovermo 0)
e così via..

Fatto questo, come facciamo a mostrare a video qualcosa alle coordinate lette ed elaborate?

Ci basterà dire al programma di mettere un carattere grafico quando verrà trovato il numero 1 (o quello che vogliamo andando avanti col programma) in modo del tutto similare a questo:

Locate x,y
if map(x,y)=1 then print chr$(127);:

– Posiziona il cursore (LOCATE) alla coordinata specificata dal nostro programma nei cicli for
– se (IF) alla coordinata specificata troviamo il numero 1 allora (THEN) stampa (PRINT) il nostro carattere grafico (CHR$()).

Programma completo

1 cls: DIM map(7,4)
2 For y=1 to 4
3 For x=1 to 7
4 read a:map(x,y)=a
5 Locate x,y : if map(x,y)=1 then print chr$(127);:
6 Next
7 Next

8 DATA 1,0,0,0,0,0,1
9 DATA 1,0,0,1,1,0,1
10 DATA 1,0,0,1,0,0,1
11 DATA 1,1,1,1,1,1,1

 

Risultato

adesso scrivete un bel RUN e premete invio… il risultato dovrebbe essere questo.

 

Vi ricordo inoltre che le logiche qui riportate, sono “compatibili” anche con altri linguaggi più evoluti e per tutte le altre piattaforme.
Se avete dubbi, chiedete pure sul nostro gruppo Facebook e sarò felicissimo di aiutarvi.

Nei prossimi capitoli vedremo come interagire con la mappa generando collisioni con essa ed elementi di gioco (mostri, bonus, chiavi ed altro)
Vi ricordo come sempre di seguirci sul gruppo Facebook per informazioni e dettagli!

 

Capitoli precedenti.

– Primo capitolo – Come si programmava.
– Secondo Capitolo – Muoviamo un oggetto.

Materiale informativo e didattico.

Emulatore utilizzato.
JavaCPC
Locomotive Basic

Fabrizio Radica

Fabrizio Radica

Fabrizio Radica nasce nel '75. Appassionato di Computers, Videogames, Musica ed Arte. Ormai ha fatto pace con se stesso ammettendo di essere un Nerd :D

Potrebbero interessarti anche...