Table of Contents
Sprite
Intro
Gli sprite nel C64 sono degli oggetti grafici facilmente programmabili, utili per creare giochi. Sono gestiti via hardware dal chip grafico VIC-II, tramite una serie di registri.
Registri
Attivazione
Per attivare gli sprite c'è il registro 53269 ($D015); ciascuno degli 8 bit attiva uno sprite:
bit 0 | sprite 0 |
bit 1 | sprite 1 |
bit 2 | sprite 2 |
…
bit 7 | sprite 7 |
In Basic si può quindi usare:
POKE 53269,3 : REM ATTIVA GLI SPRITE 0 e 1 POKE 53269,255: REM ATTIVA TUTTI E 8 GLI SPRITE
Posizionamento
I registri da 53248 ($D000) a 53263 ($D00F) controllano il posizionamento X,Y, rispetto all'angolo in alto a sinistra. Ciascun registro controlla una coordinata per ciascuno sprite:
Registro | Descrizione |
---|---|
53248 | sprite 0 X |
53249 | sprite 0 Y |
53250 | sprite 1 X |
53251 | sprite 1 Y |
…
I valori possibili sono quindi 0-255. Mentre la coordinata Y copre tutti i valori visibili a schermo, la coordinata X viene anche gestita dal registro 53264 ($D010) (valido per tutti gli sprite) che consente di estendere gli sprite oltre la coordinata X 255 (visibile a video solo fino al 343).
Colore
Gli sprite possono essere monocolore (risoluzione max 24×21) oppure multicolore (risoluzione max 12×21).
Multicolore
La modalità multicolore prevede, oltre al colore principale dello sprite, anche due colori aggiuntivi, condivisi da tutti gli sprite. Si usano i registri 53285, 53286 e 53276:
POKE 53285,1: REM MULTICOLOR 1 (BIANCO) X TUTTI GLI SPRITE POKE 53286,0: REM MULTICOLOR 2 (NERO) X TUTTI GLI SPRITE POKE 53276,3: REM MULTICOLOR X SPRITE 0 E 1
Colore principale
Il colore principale si setta nei registri 53287-53294, separatamente per ogni sprite.
Definizione
La definizione (forma) dello sprite avviene in questo modo. Sono presenti delle locazioni di memoria, ognuna dedicata ad uno sprite:
Locazione. | Descrizione |
---|---|
2040 ($7F8) | puntatore sprite 0 |
2041 ($7F9) | puntatore sprite 1 |
…
2047 ($7FF) | puntatore sprite 7 |
Ciascuna locazione non è abbastanza capiente per contenere la definizione di uno sprite (63 byte per i monocolore: 24 bit x 21); quindi ogni locazione è un puntatore ad un gruppo di locazioni di 63 byte. Ad es:
POKE 2040,200 POKE 2041,201
Le righe sopra stabiliscono che lo sprite 0 è definito (nella sua forma) al gruppo di locazioni che iniziano alla memoria 200×64 (12800); lo sprite 1 invece è definito al gruppo di locazioni che iniziano alla memoria 201×64 (12864).
Sarà necessario quindi riempire le locazioni che iniziano da 12800 e 12864 con i dati per formare gli sprite; conviene utilizzare un tool come il seguente, che facilita l'operazione di disegno:
Aiuta soprattutto quando si tratta di disegnare sprite multicolore. Le righe sottostanti riempiono le locazioni con i dati degli sprite (ottenuti dal tool sopra):
70 FOR X=12800 TO 12800+127: READ Y: POKE X,Y: NEXT X: REM SPRITE DATA 1000 :: rem pac_0 / multicolor / color: 3 1010 data 0,0,0,0,0,0,0,40,0,2,170,128,10,170,160,42 1020 data 170,168,42,170,168,41,106,88,165,89,84,165,249,124,165,249 1030 data 126,169,106,90,170,170,170,170,170,170,170,170,170,170,170,170 1040 data 170,170,170,170,170,170,170,170,170,162,130,138,128,130,2,131 1050 :: rem pac_1 / multicolor / color: 3 1060 data 0,0,0,0,0,0,0,40,0,2,170,128,10,170,160,42 1070 data 170,168,42,170,168,41,106,88,165,89,84,165,249,124,165,249 1080 data 126,169,106,90,170,170,170,170,170,170,170,170,170,170,170,170 1090 data 170,170,170,170,170,170,170,170,170,162,130,138,34,0,136,131
Le definizioni degli sprite sono due animazioni di un fantasma di PacMan; entrambe sono associate a due sprite. Si capisce quindi che ogni sprite può avere più definizioni/animazioni, che, come in questo caso, sono associate a sprite distinti:
POKE 2040,200 ... POKE 2040,201
Qui lo stesso sprite (un fantasma) ha prima una definizione/animazione, quella alla locazione 200×64=12800, poi una definizione alla locazione 201×64=12864.
In fondo alla pagina c'è il sorgente completo, che come risultato dà due fantasmini di PacMan che si spostano da sinistra a destra:
10 print chr$(147) 20 print "w commodore!" 40 poke 53285,1: rem multicolor 1 x tutti sprite 50 poke 53286,0: rem multicolor 2 x tutti sprite 60 poke 53269,255 : rem attiva tutti e 8 sprite 62 poke 53276, 3: rem multicolor sprite 0 e 1 64 poke 53277, 0: rem non allargare tutti sprite 66 poke 53271, 0: rem non alzare tutti sprite 67 poke 53287,2: rem color sprite 0 68 poke 53288,3: rem color sprite 1 70 for x=12800 to 12800+127: read y: poke x,y: next x: rem sprite data 85 for x=24 to 255 90 :: rem pac_0 100 poke 2040,200: rem pointer sprite 0 110 poke 53248, x: rem x pos sprite 0 120 poke 53249, 120: rem y pos sprite 0 130 poke 2040,201: rem pointer sprite 0 140 poke 53248, x: rem x pos sprite 0 150 poke 53249, 120: rem y pos sprite 0 160 :: rem pac_1 180 poke 2041,200: rem pointer sprite 1 190 poke 53250, x: rem x pos sprite 1 200 poke 53251, 150: rem y pos sprite 1 210 poke 2041,201: rem pointer sprite 1 220 poke 53250, x: rem x pos sprite 1 230 poke 53251, 150: rem y pos sprite 1 240 next x 1000 :: rem pac_0 / multicolor / color: 3 1010 data 0,0,0,0,0,0,0,40,0,2,170,128,10,170,160,42 1020 data 170,168,42,170,168,41,106,88,165,89,84,165,249,124,165,249 1030 data 126,169,106,90,170,170,170,170,170,170,170,170,170,170,170,170 1040 data 170,170,170,170,170,170,170,170,170,162,130,138,128,130,2,131 1050 :: rem pac_1 / multicolor / color: 3 1060 data 0,0,0,0,0,0,0,40,0,2,170,128,10,170,160,42 1070 data 170,168,42,170,168,41,106,88,165,89,84,165,249,124,165,249 1080 data 126,169,106,90,170,170,170,170,170,170,170,170,170,170,170,170 1090 data 170,170,170,170,170,170,170,170,170,162,130,138,34,0,136,131