User Tools

Site Tools


content:retrocomputing:sprite

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
content:retrocomputing:sprite [2022/08/16 18:54] – [Definizione] admincontent:retrocomputing:sprite [2023/08/15 14:54] (current) – [Spostamento e animazione] admin
Line 108: Line 108:
 Qui lo stesso sprite (un fantasma) ha prima una definizione/animazione, quella alla locazione 200x64=12800, poi una definizione alla locazione 201x64=12864. Qui lo stesso sprite (un fantasma) ha prima una definizione/animazione, quella alla locazione 200x64=12800, poi una definizione alla locazione 201x64=12864.
  
-In fondo alla pagina c'è il sorgente completo, che come risultato dà il seguente: +In fondo alla pagina c'è il sorgente completo, che come risultato dà due fantasmini di PacMan che si spostano da sinistra a destra:
  
 +{{:sprite:pacman.png|}}
  
 <code> <code>
Line 156: Line 156:
 1090 data 170,170,170,170,170,170,170,170,170,162,130,138,34,0,136,131 1090 data 170,170,170,170,170,170,170,170,170,162,130,138,34,0,136,131
 </code> </code>
 +
 +===== Sprite animation e collision =====
 +
 +Il seguente esempio è tratto dal libro //Commodore 64 Graphics and Sound//; è diverso rispetto al listato sopra, perché non ridefinisce gli sprite con un altro disegno, ma visualizza alternativamente due sprite, con due definizioni diverse per creare l'animazione, relative alla stessa figura (un alieno).
 +
 +{{:sprite:sprite-aliens.png|}}
 +==== Definizione sprite ====
 +
 +Vengono **definiti i dati di 5 sprite**, usando alcune locazioni di memoria a partire da (13*64=)832. Questa area è in realtà il //cassette buffer//, per cui se si usa il registratore, i dati degli sprite verrebbero soprascritti :!:
 +
 +<file>
 +130 poke2040,13:poke2041,14
 +140 poke2042,13:poke2043,14
 +150 poke2044,15
 +</file>
 +
 +==== Spostamento e animazione ====
 +
 +Si tratta quindi di 4 sprite 'alieni' più l'ultimo (2044) che rappresenta una esplosione. In realtà vengono visualizzati solo 2 sprite alla volta, all'inizio gli **sprite 0 e 2** (definiti in 2040 e 2042), uno da un lato, l'altro dal lato opposto, con un'animazione 'a gambe aperte':
 +
 +<file>
 +255 rem move sprites 0 and 2
 +260 pokevc,x:pokevc+4,255-x
 +...
 +285 rem display sprites 0 and 2
 +290 pokevc+21,5
 +300 for t=1 to 200:next
 +</file>
 +
 +I registri nel VIC-II per le **posizioni X degli sprite 0-3** (vc=53248, vc+2=53250, vc+4=53252 e vc+6=53254):
 +
 +{{:sprite:vic-ii-sprite-x-pos.png|}}  
 +
 +Il registro 'vc+21=53269' tramite il quale vengono visualizzati solo gli **sprite abilitati**:
 +
 +{{:sprite:vic-22-sprite-enable.png|}}
 +
 +Poi vengono visualizzati gli sprite 1 e 3 (2041 e 2043) con un'animazione 'a gambe chiuse', un po' più avanti nella direzione 'x':
 +
 +<file>
 +305 rem move sprites 1 and 3
 +310 pokevc+2,x+4:pokevc+6,251-x
 +...
 +335 rem display sprites 1 and 3
 +340 pokevc+21,10
 +350 for t=1 to 200:next
 +</file>
 +
 +L'effetto è quello di dare un'animazione a due alieni che si avvicinano, per poi scontrarsi. Di seguito il **listato completo**:
 +
 +<file>
 +100 rem sprite movement and collisions
 +105 rem clear screen
 +110 print chr$(147)
 +115 rem vic chip start address
 +120 vc=53248
 +125 rem set sprite pointers
 +130 poke2040,13:poke2041,14
 +140 poke2042,13:poke2043,14
 +150 poke2044,15
 +155 rem read sprite data
 +160 for n=0 to 191
 +170 read a:poke832+n,a
 +180 next
 +185 rem set y positions
 +190 poke vc+1,150:pokevc+3,150
 +200 poke vc+5,150:pokevc+7,150
 +205 rem set sprite colors
 +210 pokevc+39,4:pokevc+40,4
 +220 pokevc+41,3:pokevc+42,3
 +230 pokevc+43,7:pokevc+21,0
 +240 for n=1 to 10
 +241 print chr$(147)
 +242 print"sp0,x:","sp2,x:"
 +243 print"sp1,x:","sp3,x:"
 +244 print "cont:";n"/10"
 +250 for x=0 to 130 step 8
 +255 rem move sprites 0 and 2
 +260 pokevc,x:pokevc+4,255-x
 +261 print "sq]]]]]]";x
 +262 print "sq]]]]]]]]]]]]]]]]";255-x
 +265 rem check for collision
 +270 cd=peek(vc+30)
 +280 if cd<>0 then 370
 +285 rem display sprites 0 and 2
 +290 pokevc+21,5
 +300 for t=1 to1000:next
 +305 rem move sprites 1 and 3
 +306 print "sqq]]]]]]";x+4
 +307 print "sqq]]]]]]]]]]]]]]]]";251-x
 +310 pokevc+2,x+4:pokevc+6,251-x
 +315 rem check for collision
 +320 cd=peek(vc+30)
 +330 if cd<>0 then 370
 +335 rem display sprites 1 and 3
 +340 pokevc+21,10
 +350 for t=1 to1000:next
 +360 next x
 +365 rem display explosion sprite 4
 +370 pokevc+8,x:pokevc+9,130
 +380 pokevc+23,16:pokevc+29,16
 +390 pokevc+21,16
 +400 for t=1 to 1000:next
 +410 pokevc+21,0:cd=peek(vc+30)
 +420 for t=1 to 500:next
 +430 next n
 +440 end
 +400 for t=1 to 1000:next
 +410 pokevc+21,0:cd=peek(vc+30)
 +420 for t=1 to 500:next
 +430 next n
 +440 end
 +795 rem sprite 0 and 2 data
 +800 data 0,102,0,1,255,128
 +810 data 15,255,240,31,255,248
 +820 data 63,255,252,63,60,252
 +830 data 63,60,252,63,255,252
 +840 data 31,255,248,15,255,240
 +850 data 3,0,192,6,0,96
 +860 data 12,0,48,24,0,24
 +870 data 48,0,12,96,0,6
 +880 data 192,0,3,0,0,0
 +890 data 0,0,0,0,0,0
 +900 data 0,0,0,0
 +905 rem sprite 1 and 3 data
 +910 data 0,102,0,1,255,128
 +920 data 15,255,240,31,255,248
 +930 data 63,255,252,63,60,252
 +940 data 63,60,252,63,255,252
 +950 data 31,255,248,15,255,240
 +960 data 3,0,192,6,0,96
 +970 data 12,0,48,24,0,24
 +980 data 12,0,48,6,0,96
 +990 data 3,0,192,0,0,0
 +1000 data 0,0,0,0,0,0
 +1010 data 0,0,0,0
 +1015 rem sprite 4 data
 +1020 data 96,24,12,48,24,24
 +1030 data 24,24,48,12,24,96
 +1040 data 6,24,192,3,25,128
 +1050 data 1,155,0,0,255,0
 +1060 data 0,102,0,255,231,255
 +1070 data 0,102,0,0,255,0
 +1080 data 1,155,0,3,25,128
 +1090 data 6,24,192,12,24,96
 +1100 data 24,24,48,48,24,24
 +1110 data 96,24,12,0,0,0
 +1120 data 0,0,0,0
 +</file>
 +
content/retrocomputing/sprite.1660668844.txt.gz · Last modified: 2022/08/16 18:54 by admin