User Tools

Site Tools


content:retrocomputing:sprite

This is an old revision of the document!


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 0sprite 0
bit 1sprite 1
bit 2sprite 2

bit 7sprite 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
Il 53269 è perciò di un registro valido per tutti 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:

RegistroDescrizione
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:

https://www.spritemate.com

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à il seguente:

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
content/retrocomputing/sprite.1660668983.txt.gz · Last modified: 2022/08/16 18:56 by admin