LA GRAFICA – GLI SPRITES (4° PARTE)

da | Gen 15, 2024 | MSX BASIC | 0 commenti

Eccoci giunti alla parte più importante della grafica, quella che aspettavate con entusiasmo! Come disegnare degli oggetti o personaggi sullo schermo e poi farli muovere: GLI SPRITES. Prima di iniziare la spiegazione faccio mente locale di quello che ho detto, quando ho spiegato lo SCREEN. Ricordate che la 2° opzione, era quella per definire la grandezza degli sprites. Ripeto; se vogliamo lavorare con sprite 8X8, useremo tale opzione con 0 o 1, cioè il primo, con dimensioni normali e il secondo raddoppiati. Invece, opzione 2 e 3 vale per la creazione di sprites 16X16, 2 normali, 3 raddoppiati. Spiego velocemente le caratteristiche ed il loro comportamento. Gli sprites possono essere usati negli screen 1,2 e 3 ed hanno tutti la stessa funzionalità, non importa la suddivisione in pixel dello schermo, loro lavorano su piani al di fuori di quest’ultimo. Possiamo create 256 sprites 8X8 (0-255) e 64 sprite 16X16 (0-63). Ma sia sul primo che sul secondo metodo che useremo, ne possiamo visualizzare solo 32. Questo perchè ogni sprite ha un suo piano e non possiamo inserire più di uno, se lo facciamo, il secondo richiamato coprirà il primo. I piani per gli sprites sono numerati da 0 a 31 e quello di valore più basso avrà priorità sul tutti gli altri che vengono dopo. Per farvi capire meglio, se uno sprite con piano 0 si soprappone ad un altro di valore uno, il secondo sarà nascosto. Una grossa pecca dell’MSX1 è che non possiamo usare più di 4 sprites sulla stessa linea, se lo facciamo, tutti quelli con numero piano superiore non verranno visualizzati. In conclusione, possiamo usare ben 32 sprites sullo schermo man non più di 4 sulla stessa linea orizzontale. Ogni piano ha una griglia di 256X192 pixel, questo vuol dire che possiamo posizionare il nostro sprite su uno dei punti detti. Se superiamo i 255 pixel orizzontali, lo sprite apparirà dall’altro lato dello schermo, mentre in verticale, superando il 191imo pixel non lo vedremo più, perché anche se vediamo 192 pixel in verticale, ce ne sono altri 64 nascosti, in realtà la griglia è 256X256. Ricordiamoci che quando useremo gli sprites raddoppiati quello da 8X8 diventerà da 16 pixel, mentre quello da 16X16, sarà 32, perciò fate attenzione quando si dovranno calcolare le collisioni. Per creare uno sprite l’MSX ha un comando appropriato, chiamato SPRITE$. Quando impostiamo il solito parametro sullo SCREEN, assecondo di quello che abbiamo messo, creerà una matrice di 8X8 o 16X16. Ogni sprite avrà un suo numero di riconoscimento. Il primo sarà SPRITE$(0), il secondo SPRITE$(1) e così via. Cominciamo a capire come caricare la matrice 8X8 dello sprite. I codici da inserire dentro di essa sono da destra verso sinistra, sono otto linee composte da 8 caselle. Se nella casella mettiamo 1 il pixel sarà acceso se viceversa è zero sarà spento. I codici verranno caricati in una variabile alfanumerica tramite la funzione CHR$ e possono essere decimali, binari, esadecimali od anche ottali. Faccio un piccolo schema per essere più comprensibile, la faccina di un marziano.

 8 7 6 5 4 3 2 1
|1|0|0|0|0|0|0|1| 1
|0|1|0|1|1|0|1|0| 2
|0|0|1|1|1|1|0|0| 3
|0|1|1|1|1|1|1|0| 4
|1|1|0|1|1|0|1|1| 5
|1|1|1|1|1|1|1|1| 6
|0|1|1|1|1|1|1|0| 7
|0|0|1|1|1|1|0|0| 8

10 SCREEN 2,0: COLOR 15,1,1: CLS: ‘ Attiviamo lo screen grafico con griglia degli sprites 8X8
20 S$=”” :’ Inizializziamo la variabile alfanumerica. Ci servirà per caricare i dati
30 FOR I=0 TO 7:’ Ciclo per inserire i dati nella variabile
40 READ S: S$=S$+CHR$(S) : ‘ Legge un dato e lo mette dentro la variabile con CHR$
50 NEXT I: SPRITE$(0)=S$: ‘ Chiude il ciclo e crea lo sprite numero 0 con i dati della variabile S$.
60 DATA 129,90,60,126,219,255,126,60: ‘ Dati dello sprite in decimale (ma potrebbero essere binari o esadecimali)

Il nostro sprite è stato creato. Adesso lo possiamo visualizzare sullo schermo con il comando PUTSPRITE. La sua sintassi è: PUTSPRITE Numeropiano,(Coord.Oriz.,Coord.Vert.), CodiceColore, NumeroSprite. Numeropiano, come sapete già, è la pagina di visualizzazione dello sprite. Coordinate orizzontale e verticale sono il punto dove vogliamo fare apparire il nostro sprite. Codice colore è il colore che vogliamo dargli. Possiamo usare i colori disponibili dell’MSX, cioè 16 (0 a 15). Se diamo il codice 0 lo sprite sarà invisibile. Lo sprite potrà avere solo un colore. Ed infine Numero sprite è quello che diamo quando viene creato con SPRITE$, nel nostro caso è zero. Adesso facciamo apparire lo sprite al centro dello schermo, aggiungendo un linea al nostro programma.


70 PUTSPRITE 0,(124,92),15,0:’ Apparirà alle coordinate date con il colore bianco(15)
80 GOTO 80
Per creare uno sprite 16X16 invece, l’MSX usa 4 griglie 8X8. La sequenza di caricamento è: le prime 8 alto a sinistra, le seconde basso a sinistra, le terze alto a destra e le ultime basso a destra. Ed esattamente così:
1 3
2 4
Visto che prima ho disegnato un marziano, adesso faremo la sua navicella.

 1                3
----------------------------------
|0|0|0|0|1|1|1|1||1|1|1|1|0|0|0|0| |0|0|0|1|1|1|1|1||1|1|1|1|1|0|0|0|
|0|0|0|1|1|1|0|0||0|0|1|1|1|0|0|0|
|0|0|0|1|1|0|0|0||0|0|0|1|1|0|0|0|
|0|0|0|1|1|0|0|0||0|0|0|1|1|0|0|0| |0|0|0|1|1|0|0|0||0|0|0|1|1|0|0|0| |0|1|1|1|1|1|0|0||0|0|1|1|1|1|1|0|
|1|1|1|1|1|1|1|1||1|1|1|1|1|1|1|1|
----------------------------------
|1|0|1|1|1|1|1|1||1|1|1|1|1|1|0|1|
|1|1|1|1|1|1|1|1||1|1|1|1|1|1|1|1|
|0|1|1|0|1|1|1|1||1|1|1|1|0|1|1|0|
|0|1|1|1|1|1|0|1||1|0|1|1|1|1|1|0|
|0|0|1|1|1|1|1|1||1|1|1|1|1|1|0|0|
|0|0|0|1|1|0|0|0||0|0|0|1|1|0|0|0|
|0|0|1|1|0|0|0|0||0|0|0|0|1|1|0|0|
|0|1|1|0|0|0|0|0||0|0|0|0|0|1|1|0|
----------------------------------
2 4

Adesso, variamo il programma fatto sopra, affinchè possa leggere lo sprite 16X16
10 SCREEN 2,2: COLOR 15,1,1: CLS: ‘ Come sopra ma con griglia degli sprites 16X16
20 S$=””
30 FOR I=0 TO 31:’ Stavolta i dati da leggere saranno 32
40 READ S: S$=S$+CHR$(S)
50 NEXT I: SPRITE$(0)=S$
55 ‘ *** Dati Astronave ***
60 DATA 15,31,28,24,24,24,124,255
70 DATA 191,255,111,125,63,24,48,96
80 DATA 240,248,56,24,24,24,62,255
90 DATA 253,255,246,190,252,24,12,6
100 PUTSPRITE 0,(124,92),15,0
110 GOTO 110


Come avete visto cambia poco, invece di leggere 8 dati, ne legge 32, tutto il resto rimane uguale.
Facciamo muovere il nostro oggetto sullo schermo. Questo vale tutte e 2 i programmi.
20 S$=””: X=124: Y=92: ‘ Modifichiamo questa linea aggiungendo le variabili di movimento dello sprite
100 I$=INKEY$: IF I$=”” THEN 100:’ Attivata la funzione INKEY$. Rimane ferma su questa linea se non viene premuto nessun tasto

110 IF I$=”W” OR I$=”w” THEN Y=Y-1:’ Sposta lo sprite di 1 pixel verso l’alto
120 IF I$=”S” OR I$=”s” THEN Y=Y+1:’ Sposta lo sprite di 1 pixel verso il basso
130 IF I$=”Q” OR I$=”q” THEN X=X-1:’ Sposta lo sprite di 1 pixel verso sinistra
140 IF I$=”E” OR I$=”e” THEN X=X+1:’ Sposta lo sprite di 1 pixel verso destra
150 PUTSPRITE 0,(X,Y),15,0:’ Avendo le variabili, il comando farà apparire lo sprite nei punti indicati. Questo avviene così velocemente che noteremo solo lo spostamento di quest’ultimo.


160 GOTO 100: Rimanda l’esecuzione alla 100, dove aspetterà la pressione di un tasto.


Questo metodo serve solo per far capire come muovere uno sprite. In seguito spiegherò come farlo con i tasti cursore.
Visto che sono andato troppo per le lunghe, continuerò nella prossima puntata. Parlerò delle collisioni, il movimento con i tasti cursore (come detto sopra) e qualche altro trucchetto che vi servirà per cominciare a creare piccoli giochi.
Grazie a tutti e alla prossima.

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

Buongiorno a tutti, In questa puntata parlerò di un interrupt importante, specialmente per i giochi, quando vogliamo far apparire un nemico all'improvviso o un oggetto utile, ma anche per creare un cronometro o un orologio e tante altre cose. Il COMANDO sfrutta il...

it_ITIT_IT