Moving background
GFA :: Programmation :: Graphismes
Page 1 sur 1
Moving background
Moving background
Par Thyrex
Par Thyrex
Ce petit tuto va vous expliquer rapidement comment faire bouger un écran composé d'un motif 16x16.
La méthode est très simple:
Il faut avant tout avoir un sprite 16x16. Comme vous le savez déplacer un sprite ou quoi que ce soit au pixel prêt n'est pas possible sur ST. C'est pour cela qu'il faut pré-décaler le sprite sur 16 positions (voir l'article sur les sprites). Ici nous allons faire plus que décaler un seul bloc de 16x16, nous allons le décaler ET le copier sur toute la largeur de l'écran. Ce qui au final donnera 16 buffers de 16x320 pixels. Il faudra ensuite simplement affiche le bloc selon le décalage voulu et le recopier sur la totalité de l'écran.
Les sources commentés:
[Vous devez être inscrit et connecté pour voir ce lien] :
- Code:
' ***************************************
' * CODAGE D'UN MOTIF 16x16 D'UNE IMAGE *
' * DEGAS AU FORMAT 'SPRITE' *
' ***************************************
' * PAR THYREX / NLC / ESC *
' ***************************************
' * Le motif doit etre aux coordonnees *
' * x=0 y=0 dans l'image *
' ***************************************
'
fre%=FRE(0)
RESERVE fre%-32066-32-128
'
image%=MALLOC(32066)
palette%=MALLOC(32)
motif%=MALLOC(128)
'
CLS
'
PRINT AT(1,1);"fichier source (*.pi1)"
FILESELECT "A:\*.PI1","",imgname$
BLOAD imgname$,image%
'
CLS
'
~XBIOS(6,L:image%+2)
BMOVE image%+34,XBIOS(2),32000
'
FOR y%=0 TO 15
BMOVE XBIOS(2)+y%*160,motif%+y%*8,8
NEXT y%
'
BMOVE image%+2,palette%,32
'
CLS
PRINT AT(1,1);"fichier destination du motif"
FILESELECT "A:\*.inl","motif.inl",motifname$
BSAVE motifname$,motif%,128
'
CLS
PRINT AT(1,1);"fichier destination de la palette"
FILESELECT "A:\*.inl","pal.inl",palname$
BSAVE palname$,palette%,32
'
~MFREE(image%)
~MFREE(motif%)
~MFREE(palette%)
'
RESERVE fre%
'
SETCOLOR 0,7,7,7
SETCOLOR 15,0
'
EDIT
[Vous devez être inscrit et connecté pour voir ce lien] :
- Code:
' ****************************************************
' * ROUTINE DE MOVING BACKGROUND PAR THYREX/NLC/ESC *
' ****************************************************
' * N'OUBLIEZ PAS DE ME CITER SI VOUS UTILISEZ CETTE *
' * ROUTINE *
' ****************************************************
'
INLINE motif%,128
INLINE pal%,32
INLINE courbe%,1440
'
init
precalc
demo
'
> PROCEDURE init
'
r%=XBIOS(4)
IF NOT (r%=0)
~XBIOS(5,L:-1,L:-1,0)
ENDIF
'
fre%=FRE(0)
or%=XBIOS(2)
xb%=XBIOS(2)
'
CLS
'
RESERVE fre%-40960-32256 ! les buffers pour nos d‚calage et le 2‚me ‚cran
'
debut%=courbe%
fin%=courbe%+1440
pteur%=debut% ! le pointeur dans la courbe
'
nouveau%=MALLOC(32256)
ecran2%=AND(ADD(nouveau%,255),&HFFFFFF00) ! notre 2Šme ‚carn
BMOVE xb%,ecran2%,32000
'
bbuffer0%=MALLOC(2560)
bbuffer1%=MALLOC(2560)
bbuffer2%=MALLOC(2560)
bbuffer3%=MALLOC(2560)
bbuffer4%=MALLOC(2560)
bbuffer5%=MALLOC(2560)
bbuffer6%=MALLOC(2560) ! nos 16 buffers
bbuffer7%=MALLOC(2560)
bbuffer8%=MALLOC(2560)
bbuffer9%=MALLOC(2560)
bbuffer10%=MALLOC(2560)
bbuffer11%=MALLOC(2560)
bbuffer12%=MALLOC(2560)
bbuffer13%=MALLOC(2560)
bbuffer14%=MALLOC(2560)
bbuffer15%=MALLOC(2560)
'
FOR i%=0 TO 15
BMOVE motif%+i%*8,xb%+i%*160,8 ! on affiche le motif
NEXT i%
'
GET 0,0,15,15,a$ ! on le coupe
'
super%=GEMDOS(32,L:0) ! superviseur
'
RETURN
> PROCEDURE precalc
FOR i%=0 TO 15
SELECT i%
CASE 0
dest%=bbuffer0% ! choix du buffer selon le d‚calage
CASE 1
dest%=bbuffer1%
CASE 2
dest%=bbuffer2%
CASE 3
dest%=bbuffer3%
CASE 4
dest%=bbuffer4%
CASE 5
dest%=bbuffer5%
CASE 6
dest%=bbuffer6%
CASE 7
dest%=bbuffer7%
CASE 8
dest%=bbuffer8%
CASE 9
dest%=bbuffer9%
CASE 10
dest%=bbuffer10%
CASE 11
dest%=bbuffer11%
CASE 12
dest%=bbuffer12%
CASE 13
dest%=bbuffer13%
CASE 14
dest%=bbuffer14%
CASE 15
dest%=bbuffer15%
ENDSELECT
'
CLS
'
PUT i%,0,a$ ! affiche le motif au d‚calage i%
'
FOR y%=0 TO 15
'
LONG{xb%+y%*160}=LONG{xb%+y%*160} OR LONG{xb%+y%*160+8} ! recopie ce
LONG{xb%+y%*160+4}=LONG{xb%+y%*160+4} OR LONG{xb%+y%*160+8+4} !qui depasse
' !au debut de l'ecran
NEXT y%
'
GET 0,0,15,15,b$ ! coupe le motif d‚cal‚
'
FOR x%=0 TO 19
PUT x%*16,0,b$ ! recopie le sur la largeur de l'ecran
NEXT x%
'
BMOVE xb%,dest%,2560 ! et le resultat dans le buffer appropri‚
NEXT i%
'
RETURN
> PROCEDURE demo
CLS
~XBIOS(6,L:pal%) ! ma palette
'
POKE &HFFFA09,0 ! coupe toute interruption
'
DO
SWAP xb%,ecran2% !Intervertit...
~XBIOS(5,L:xb%,L:ecran2%,-1)
'
VSYNC
key%=PEEK(&HFFFC02)
IF key%=56
CARD{&HFFFF8240}=&H2 ! 'alternate' pour voir le temps machine
ENDIF
'
deca%=CARD{ADD(pteur%,2)}-1 ! on prend le d‚calage dans la courbe
'
SELECT deca%
CASE 0
dest%=bbuffer0% ! et donc le buffer
CASE 1
dest%=bbuffer1%
CASE 2
dest%=bbuffer2%
CASE 3
dest%=bbuffer3%
CASE 4
dest%=bbuffer4%
CASE 5
dest%=bbuffer5%
CASE 6
dest%=bbuffer6%
CASE 7
dest%=bbuffer7%
CASE 8
dest%=bbuffer8%
CASE 9
dest%=bbuffer9%
CASE 10
dest%=bbuffer10%
CASE 11
dest%=bbuffer11%
CASE 12
dest%=bbuffer12%
CASE 13
dest%=bbuffer13%
CASE 14
dest%=bbuffer14%
CASE 15
dest%=bbuffer15%
ENDSELECT
'
ajoute%=CARD{pteur%} ! ca c'est le d‚calage en y (multiple de 160)
'
SELECT ajoute%
CASE 0
BMOVE dest%,xb%,2560
CASE 160
BMOVE dest%+160,xb%,2400 ! et on copie selon notre d‚calage y
BMOVE dest%,xb%+2400,160
CASE 320
BMOVE dest%+320,xb%,2240
BMOVE dest%,xb%+2240,320
CASE 480
BMOVE dest%+480,xb%,2080
BMOVE dest%,xb%+2080,480
CASE 640
BMOVE dest%+640,xb%,1920
BMOVE dest%,xb%+1920,640
CASE 800
BMOVE dest%+800,xb%,1760
BMOVE dest%,xb%+1760,800
CASE 960
BMOVE dest%+960,xb%,1600
BMOVE dest%,xb%+1600,960
CASE 1120
BMOVE dest%+1120,xb%,1440
BMOVE dest%,xb%+1440,1120
CASE 1280
BMOVE dest%+1280,xb%,1280
BMOVE dest%,xb%+1280,1280
CASE 1440
BMOVE dest%+1440,xb%,1120
BMOVE dest%,xb%+1120,1440
CASE 1600
BMOVE dest%+1600,xb%,960
BMOVE dest%,xb%+960,1600
CASE 1760
BMOVE dest%+1760,xb%,800
BMOVE dest%,xb%+800,1760
CASE 1920
BMOVE dest%+1920,xb%,640
BMOVE dest%,xb%+640,1920
CASE 2080
BMOVE dest%+2080,xb%,480
BMOVE dest%,xb%+480,2080
CASE 2240
BMOVE dest%+2240,xb%,320
BMOVE dest%,xb%+320,2240
CASE 2400
BMOVE dest%+2400,xb%,160
BMOVE dest%,xb%+160,2400
ENDSELECT
'
BMOVE xb%,xb%+2560,2560
BMOVE xb%,xb%+5120,5120 ! et le resultat sur la totalit‚ de l'ecran
BMOVE xb%,xb%+10240,10240
BMOVE xb%,xb%+20480,11520
'
ADD pteur%,4
IF pteur%>=fin%
pteur%=debut% ! incremente le pointeur
ENDIF
'
CARD{&HFFFF8240}=&H0
LOOP UNTIL key%=57
bye
RETURN
> PROCEDURE bye
'
POKE &HFFFA09,100
'
~GEMDOS(32,L:super%)
'
~MFREE(nouveau%)
'
~MFREE(bbuffer0%)
~MFREE(bbuffer1%)
~MFREE(bbuffer2%)
~MFREE(bbuffer3%)
~MFREE(bbuffer4%)
~MFREE(bbuffer5%)
~MFREE(bbuffer6%)
~MFREE(bbuffer7%)
~MFREE(bbuffer8%)
~MFREE(bbuffer9%)
~MFREE(bbuffer10%)
~MFREE(bbuffer11%)
~MFREE(bbuffer12%)
~MFREE(bbuffer13%)
~MFREE(bbuffer14%)
~MFREE(bbuffer15%)
'
RESERVE fre%
'
~XBIOS(5,L:or%,L:or%,r%)
'
EDIT
'
RETURN
GFA :: Programmation :: Graphismes
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum