GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Moving background

Aller en bas

Moving background Empty Moving background

Message par Shadow272 Sam 21 Nov - 10:59

Moving background
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
Shadow272
Shadow272
Admin

Messages : 329
Date d'inscription : 28/12/2017
Age : 66
Localisation : Hainaut Belgique

http://toutatari.blog4ever.xyz/

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum