GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -39%
Ordinateur portable ASUS Chromebook Vibe CX34 Flip
Voir le deal
399 €

[ST MAG] Programmation avancée en gfa (IV) Sprites

Aller en bas

[ST MAG] Programmation avancée en gfa (IV) Sprites Empty [ST MAG] Programmation avancée en gfa (IV) Sprites

Message par tomchi Ven 23 Oct - 9:19


...............................................................
PROGRAMMATION AVANCEE E EN GfA-BASIC (IV)
par Deneb of Fantasy et Jedi of Sector One from THK

Après de longues semaines de pénible attente, voici enfin le
quatrième épisode de notre feuilleton. L'action se passe à GfA-
City et la mission de l'inspecteur consiste à déposer un sprite
dans les banlieues mal fréquentées de la mémoire vidéo. Le
risque est omniprésent, car en effet le sprite ne doit en aucun
cas se faire repérer par les octets qui gardent le fond...

CACHE-CACHE

Nous avons vu le mois dernier comment déplacer un sprite grâce à
la technique de l'écriture directe en mémoire-écran. Cependant,
celui-ci altérait le fond. Pour laisser transparaitre l'arrière-
plan derrière notre motif, il faut recourir à la technique des
caches ( ou masques ) que nous allons étudier.
Le principe est simple ( heu... ). Avant d'afficher le sprite
nous allons découper sa forme dans le fond. La place étant libre,
nous afficherons alors le sprite en surimpression. Le fond étant
noirci, les conflicts entre ce dernier et le motif ne seront que
de mauvais souvenirs. Pour réaliser la première opération, la
meilleure solution consiste à utiliser un cache. Pour le créer,
il faut effacer le sprite en ayant préalablement rempli le reste
avec la couleur 15. Le masque devra etre affiché en premier, en
couplant la fonction logique AND à l'instruction de transfert (
CARD ou LONG ). Nous afficherons ensuite le sprite en couplant
cette fois la fonction OR.


Une dernière précision avant de passer comme d'habitude aux
travaux pratiques: la technique des masques n'est utile que dans
la mesure où le sprite et le fond utilisent des plans communs.
Dans le cas contraire, les listings du mois dernier fonctionnent
à la perfection, le seul problème étant de creer la palette afin
de gerer correctement les superposition s des deux éléments. Ce
sera d'ailleurs l'objet d'un prochain article.

HOOFDPROGRAMMA

Tout d'abord, je ( Jedi ) tiens à signaler un petit problème
concernant l'un des listings de l'article du numéro 57. Dans le
programme chargé de calculer les offsets des BMOVEs, il y a deux
occurrences successives de la ligne:

DEC oterol%

Il faut bien entendu remplacer l'un des 'oterol%' par 'hauteur%'
et tout rentre dans l'ordre. Je tiens à remercier ODC ( of Sector
One ) pour m'avoir informé de cette petite erreur de frappe.
Ceci dit, enchainons directement sur les listings, en commençant
au hasard par le premier. Nous constatons au premier abord qu'il
est long ( environ 600 lignes ) ; je vous conseillerais donc de
vous lever tres tôt et de vous coucher tres tard si vous désirez
le taper dans son intégralité. Cependant, les lecteurs assidus
remarqueront de nombreux points avec le listing du mois
précédant. En effet, le principe de la prise de bloc directement
à la souris, du calcul de la courbe et de la création de tous les
modules nécessaires en un seul programme semble avoir été
unanimement apprécié. Les deux premières phases citées ci-dessus
utilisent donc les mêmes routines que lorsqu'il s'agissait des
sprites qui ignoraient le fond. En revanche, les '.LST' qui
constituent la majeure partie du listing n'ont plus rien à voir.
Tâchons de les détailler dans l'ordre dans lequel ils se
présentent. Les deux premiers ont respectivement pour but de
sauvegarder et de restituer le fond, à l'endroit où se trouvait
le sprite. Il existe en fait deux couples de routines bien
distinctes. En effet, la premiè re utilise l'instruction BMOVE
afin de sauver d'un seul coup l'intégralité des lignes où se
trouvait le sprite. L'avantage de cette instruction est de
présenter un très bon rapport 'taille du sprite/temps machine'
dans le ca s où le sprite serait relativement étalé
horizontalement. Le second type de routine utilisé nécessite
une fois de plus l'instruction LONG afin de ne sauvegarder le
fond que sur une taille égale à celle du sprite. Avantage: cette
technique marche très bien si les sprites sont hauts et étroits.
Inconvénient: ajoute quelques centaines de lignes à la longueur
de votre listing final. Je vous conseille d'essayer les deux
techniques et de voir à chaque fois laquelle est la plus
avantageuse. A noter que le programme vous demandera gentiment à
l'aide d'une boite d'alerte quelle méthode vous désirez adopter.
Le troisième '.LST' a pour but la reservation des deux zones (
une pour chaque écran ) dans lesquelles le fond sera sauvegardé.
L'instruction MALLOC convient parfaitement pour ce type
d'application ( voir encadré).
Le dernier fichier mergable crée est bien entendu destiné à
l'affichage du sprite proprement dit. Le masque sera directement
calculé par blocs de seize pixels par superposition des quatre
plans ( %1111=15, d'où la couleur 15 dont il était question plus
haut ). Nous pourrions ensuite le combiner sans cesse avec un AND
puis superposer le sprite avec un OR, mais dans la moitié des
cas, ces deux opérations sont inutiles. Ainsi, lorsque le masque
est nul, le fond sera effacé dans son inté gralité. Inutile
d'employer des fonctions logiques dans ce cas, le résultat sera
identique. De même, lorsqu'un plan du sprite comble parfaitement
les 'trous' que ferait le masque dans le fond, le cache est
inutile et un unique OR suffit. Si les calculs logiques vous
posent problème, ne vous inquiétez pas car ils seront traités
dans un prochain article. Quoi qu'il en soit, le programme fourni
ici a été étudié de façon à générer le code le plus compact et le
plus rapide possible e t vous pouvez lui accorder votre entière
confiance.
Le second listing est un exemple simple qui déplace un sprite sur
une image Néochrome en guise d'arrière plan. Il n'y a pas grand
chose à préciser sur ce programme. Néanmoins, n'oubliez pas de
'merger' les différents modules crées par le premier listing, de
charger le INLINE, et de changer le nom du fichier Néochrome.
Comme toujours, ce programme doit être compilé pour tourner à une
vitesse raisonnable.

Code:

.LISTING 1 - SPRITE CONSTRUCTION KIT
.par Jedi of Sector One from The Heavy Killers
.
.Ce programme cr‚e absolument tous les fichiers
.n‚cessaires … l'animation de sprites
.sauvegardant le fond en GfA-Basic
.
VSYNC
CLS
VSYNC
SETCOLOR 0,0
SETCOLOR 15,1911
.
.Chargement de l'image dans laquelle
.on va d‚couper le sprite
.
ALERT 2," | |    Charger une image | ",0," Degas | Neo | Quit ",format%
SELECT format%
CASE 3
  EDIT
CASE 1
  FILESELECT "\*.PI1","",nfile$
  nfile$=nfile$+".PI1"
  IF EXIST(nfile$)
    OPEN "I",#1,nfile$
    SEEK #1,2
    pal$=INPUT$(32,#1)
    img$=INPUT$(32000,#1)
    CLOSE #1
  ELSE
    RUN
  ENDIF
CASE 2
  FILESELECT "\*.NEO","",nfile$
  nfile$=nfile$+".NEO"
  IF EXIST(nfile$)
    OPEN "I",#1,nfile$
    SEEK #1,4
    pal$=INPUT$(32,#1)
    SEEK #1,128
    img$=INPUT$(32000,#1)
    CLOSE #1
  ELSE
    RUN
  ENDIF
ENDSELECT
VSYNC
.
.Voir listing du mois dernier
.
GRAPHMODE 3
FOR a%=0 TO 15
  SETCOLOR a%,0
NEXT a%
SPUT img$
~XBIOS(6,L:V:pal$)
VSYNC
IF DPEEK(&HFFFF8240)=DPEEK(&HFFFF825E)
  SDPOKE &HFFFF825E,NOT DPEEK(&HFFFF8240)
ENDIF
WHILE MOUSEK
WEND
HIDEM
xol%=512
yol%=512
REPEAT
  MOUSE x1%,y1%,z%
  IF x1%<>xol% OR y1%<>yol%
    VSYNC
    SPUT img$
    LINE x1%,0,x1%,199
    LINE 0,y1%,319,y1%
    xol%=x1%
    yol%=y1%
  ENDIF
UNTIL z%
xol%=512
yol%=512
WHILE z%
  MOUSE x2%,y2%,z%
  IF x2%<>xol% OR y2%<>yol%
    VSYNC
    SPUT img$
    BOX x1%,y1%,x2%,y2%
    xol%=x2%
    yol%=y2%
  ENDIF
WEND
VSYNC
SPUT img$
GRAPHMODE 1
GET x1%,y1%,x2%,y2%,bloc$
VSYNC
CLS
PUT 0,0,bloc$
sizex%=SUCC(ABS(x1%-x2%))
sizey%=SUCC(ABS(y1%-y2%))
sizex%=ADD(sizex%,15) AND &HFFF0
PRINT AT(1,22);"Taille en X: ";sizex%''"Taille en Y: ";sizey%
PRINT "Soit ";sizex%*sizey%/16;" blocs de 16 pixels."
INPUT "Nombre de plans: ",nplan%
nplan%=MAX(1,MOD(nplan%,5))
ace%=SHR(sizex%,1)
DEC sizey%
.
.Efface les plans en trop
.
IF nplan%<>4
  FOR ligne%=0 TO sizey%
    FOR col%=0 TO ace% STEP 8
      adresse%=XBIOS(2)+col%+ligne%*160
      SELECT nplan%
      CASE 1
        CARD{adresse%+2}=0
        LONG{adresse%+4}=0
      CASE 2
        LONG{adresse%+4}=0
      CASE 3
        CARD{adresse%+6}=0
      ENDSELECT
    NEXT col%
  NEXT ligne%
ENDIF
PRINT "Ok pour le sprite ? ( O/N )";
REPEAT
  key$=UPPER$(INPUT$(1))
  IF key$="N"
    RUN
  ENDIF
UNTIL key$="O"
GET 0,0,319,167,sprite$
CLS
.
ALERT 2," | D‚sirez-vous une sauvegarde |    du fond sans BMOVE ?",0," Oui | Non ",aksey%
IF aksey%=1
  .
  .Technique des CARDs et LONGs
  .
  PRINT "Entrez le nom du fichier .LST"
  PRINT "destin‚ … la sauvegarde du fond"
  FILESELECT "\*.LST","SAVEFOND.LST",nfile$
  nfile$=nfile$+".LST"
  IF nfile$=".LST"
    EDIT
  ENDIF
  CLS
  PRINT "Entrez le nom du fichier .LST"
  PRINT "destin‚ … la restauration du fond"
  FILESELECT "\*.LST","RESTAURE.LST",nfile2$
  nfile2$=nfile2$+".LST"
  IF nfile2$=".LST"
    EDIT
  ENDIF
  CLS
  OPEN "o",#1,nfile$
  PRINT #1,"PROCEDURE sauve_fond"
  OPEN "o",#2,nfile2$
  CLR odc%
  FOR ligne%=0 TO sizey%
    FOR col%=0 TO ace% STEP 8
      offset%=col%+ligne%*160
      .
      .Si l'offset est nul, inutile
      .d'additionner 0 … la variable
      .( Cet imb‚cile de compilateur
      .est incapable de l'optimiser )
      .
      IF odc%
        PRINT #1,"LONG{sav%+";odc%;"}=LONG{jedi%+";offset%;"}"
        PRINT #1,"LONG{sav%+";odc%+4;"}=LONG{jedi%+";offset%+4;"}"
        PRINT #2,"LONG{jedi%+";offset%;"}=LONG{sav%+";odc%;"}"
        PRINT #2,"LONG{jedi%+";offset%+4;"}=LONG{sav%+";odc%+4;"}"
        ADD odc%,8
      ELSE
        PRINT #1,"LONG{sav%}=LONG{jedi%}"
        PRINT #1,"LONG{sav%+4}=LONG{jedi%+4}"
        PRINT #2,"LONG{jedi%}=LONG{sav%}"
        PRINT #2,"LONG{jedi%+4}=LONG{sav%+4}"
        odc%=8
      ENDIF
    NEXT col%
  NEXT ligne%
  CLOSE #2
  PRINT #1,"RETURN"
  CLOSE #1
ELSE
  .
  .Technique des BMOVEs
  .
  PRINT "Entrez le nom du fichier .LST"
  PRINT "destin‚ … la sauvegarde du fond"
  FILESELECT "\*.LST","SAVEFOND.LST",nfile$
  nfile$=nfile$+".LST"
  IF nfile$=".LST"
    EDIT
  ENDIF
  OPEN "o",#1,nfile$
  odc%=MUL(160,SUCC(sizey%))
  PRINT #1,"PROCEDURE sauve_fond"
  PRINT #1,"BMOVE jedi%,sav%,";odc%
  PRINT #1,"RETURN"
  CLOSE #1
  CLS
  PRINT "Entrez le nom du fichier .LST"
  PRINT "destin‚ … la restauration du fond"
  FILESELECT "\*.LST","RESTAURE.LST",nfile$
  nfile$=nfile$+".LST"
  IF nfile$=".LST"
    EDIT
  ENDIF
  OPEN "o",#1,nfile$
  PRINT #1,"BMOVE sav%,jedi%,";odc%
  CLOSE #1
ENDIF
CLS
.
.D‚claration des buffers
.
PRINT "Entrez le nom du fichier .LST"
PRINT "destin‚ … la reservation des"
PRINT "zones de sauvegarde."
FILESELECT "\*.LST","RESERVE.LST",nfile$
nfile$=nfile$+".LST"
IF nfile$=".LST"
  EDIT
ENDIF
OPEN "o",#1,nfile$
PRINT #1,"RESERVE memoire%-32256-";odc%;"*2"
PRINT #1,"sav1%=MALLOC(";odc%;")"
PRINT #1,"sav2%=MALLOC(";odc%;")"
.
.Recopie le fond dans les buffers
.( pour ne pas effacer le fond lors...
...de la premiŠre restauration )
.
IF aksey%=2
  PRINT #1,"BMOVE XBIOS(2),sav1%,";odc%
ELSE
  PRINT #1,"sav%=sav1%"
  PRINT #1,"jedi%=XBIOS(2)"
  PRINT #1,"sauve_fond"
ENDIF
PRINT #1,"BMOVE sav1%,sav2%,";odc%
CLOSE #1
CLS
.
.Routine d'affichage masqu‚
.
PRINT "Entrez le nom du fichier .LST"
PRINT "destin‚ … l'affichage du sprite"
FILESELECT "\*.LST","AFFICHE.LST",nfile$
nfile$=nfile$+".LST"
IF nfile$=".LST"
  EDIT
ENDIF
OPEN "o",#1,nfile$
FOR phase%=0 TO 15
  CLS
  PUT phase%,0,sprite$
  PRINT AT(1,25);"Phase nø";phase%;"/15";
  PRINT #1,"PROCEDURE sprite";phase%
  FOR ligne%=0 TO sizey%
    FOR col%=0 TO ace% STEP 8
      offset%=col%+ligne%*160
      alpha%=ADD(XBIOS(2),offset%)
      .
      .Creation du masque en superposant
      .les 4 plans du mot courant
      .
      masque%=OR(CARD{alpha%},CARD{alpha%+2})
      masque%=OR(masque%,CARD{alpha%+4})
      masque%=OR(masque%,CARD{alpha%+6})
      masque%=AND(NOT masque%,&HFFFF)
      masquel%=OR(masque%,SWAP(masque%))
      .
      IF masque%
        .
        .Meme remarque que pr‚c‚demment
        .en ce qui concerne l'offset nul
        .
        IF offset%
          SELECT nplan%
          CASE 1 ! 1 plan
            IF CARD{alpha%}
              PRINT #1,"LONG{jedi%+";offset%;"}=";
              PRINT #1,"OR(AND(LONG{jedi%+";offset%;"},";
              PRINT #1,masque%;"),";
              PRINT #1,SWAP(CARD{alpha%});")"
              PRINT #1,"LONG{jedi%+";offset%+4;"}=";
              PRINT #1,"AND(LONG{jedi%+";offset%+4;"},";
              PRINT #1,masquel%;")"
            ENDIF
          CASE 2 ! 2 plans
            IF LONG{alpha%}
              IF XOR(LONG{alpha%},masquel%)<>-1
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(AND(LONG{jedi%+";offset%;"},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(LONG{jedi%+";offset%;"},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
              PRINT #1,"LONG{jedi%+";offset%+4;"}=";
              PRINT #1,"AND(LONG{jedi%+";offset%+4;"},";
              PRINT #1,masquel%;")"
            ENDIF
          CASE 3 ! 3 plans
            IF LONG{alpha%}
              IF XOR(alpha%,masquel%)<>-1
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(AND(LONG{jedi%+";offset%;"},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(LONG{jedi%+";offset%;"},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"AND(LONG{jedi%+";offset%;"},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
            IF CARD{alpha%+4}
              PRINT #1,"LONG{jedi%+";offset%+4;"}=";
              PRINT #1,"OR(AND(LONG{jedi%+";offset%+4;"},";
              PRINT #1,masquel%;"),";
              PRINT #1,SWAP(CARD{alpha%+4});")"
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+";offset%+4;"}=";
                PRINT #1,"AND(LONG{jedi%+";offset%+4;"},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
          CASE 4 ! 4 plans
            IF LONG{alpha%}
              IF XOR(LONG{alpha%},masquel%)<>-1
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(AND(LONG{jedi%+";offset%;"},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"OR(LONG{jedi%+";offset%;"},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+";offset%;"}=";
                PRINT #1,"AND(LONG{jedi%+";offset%;"},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
            IF LONG{alpha%+4}
              IF XOR(LONG{alpha%+4},masquel%)<>-1
                PRINT #1,"LONG{jedi%+";offset%+4;"}=";
                PRINT #1,"OR(AND(LONG{jedi%+";offset%+4;"},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%+4};")"
              ELSE
                PRINT #1,"LONG{jedi%+";offset%+4;"}=";
                PRINT #1,"OR(LONG{jedi%+";offset%+4;"},";
                PRINT #1,LONG{alpha%+4};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+";offset%+4;"}=";
                PRINT #1,"AND(LONG{jedi%+";offset%+4;"},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
          ENDSELECT
        ELSE
          .
          .Offset nul
          .
          SELECT nplan%
          CASE 1
            IF CARD{alpha%}
              PRINT #1,"LONG{jedi%}=";
              PRINT #1,"OR(AND(LONG{jedi%},";
              PRINT #1,masque%;"),";
              PRINT #1,SWAP(CARD{alpha%});")"
              PRINT #1,"LONG{jedi%+4}=";
              PRINT #1,"AND(LONG{jedi%+4},";
              PRINT #1,masquel%;")"
            ENDIF
          CASE 2
            IF LONG{alpha%}
              IF XOR(LONG{alpha%},masquel%)<>-1
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(AND(LONG{jedi%},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(LONG{jedi%},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
              PRINT #1,"LONG{jedi%+4}=";
              PRINT #1,"AND(LONG{jedi%+4},";
              PRINT #1,masquel%;")"
            ENDIF
          CASE 3
            IF LONG{alpha%}
              IF XOR(LONG{alpha%},masquel%)<>-1
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(AND(LONG{jedi%},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(LONG{jedi%},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"AND(LONG{jedi%},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
            IF CARD{alpha%+4}
              PRINT #1,"LONG{jedi%+4}=";
              PRINT #1,"OR(AND(LONG{jedi%+4},";
              PRINT #1,masquel%;"),";
              PRINT #1,SWAP(CARD{alpha%+4});")"
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+4}=";
                PRINT #1,"AND(LONG{jedi%+4},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
          CASE 4
            IF LONG{alpha%}
              IF XOR(LONG{alpha%},masquel%)<>-1
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(AND(LONG{jedi%},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%};")"
              ELSE
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"OR(LONG{jedi%},";
                PRINT #1,LONG{alpha%};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%}=";
                PRINT #1,"AND(LONG{jedi%},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
            IF LONG{alpha%+4}
              IF XOR(LONG{alpha%+4},masquel%)<>-1
                PRINT #1,"LONG{jedi%+4}=";
                PRINT #1,"OR(AND(LONG{jedi%+4},";
                PRINT #1,masquel%;"),";
                PRINT #1,LONG{alpha%+4};")"
              ELSE
                PRINT #1,"LONG{jedi%+4}=";
                PRINT #1,"OR(LONG{jedi%+4},";
                PRINT #1,LONG{alpha%+4};")"
              ENDIF
            ELSE
              IF masquel%<>-1
                PRINT #1,"LONG{jedi%+4}=";
                PRINT #1,"AND(LONG{jedi%+4},";
                PRINT #1,masquel%;")"
              ENDIF
            ENDIF
          ENDSELECT
        ENDIF
      ELSE
        .
        .Cas ou le masque serait nul
        .
        IF offset%
          SELECT nplan%
          CASE 1
            PRINT #1,"LONG{jedi%+";offset%;"}=";
            PRINT #1,SWAP(CARD{alpha%})
            PRINT #1,"LONG{jedi%+";offset%+4;"}=0"
          CASE 2
            PRINT #1,"LONG{jedi%+";offset%;"}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+";offset%+4;"}=0"
          CASE 3
            PRINT #1,"LONG{jedi%+";offset%;"}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+";offset%+4;"}=";
            PRINT #1,SWAP(CARD{alpha%+4})
          CASE 4
            PRINT #1,"LONG{jedi%+";offset%;"}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+";offset%+4;"}=";
            PRINT #1,LONG{alpha%+4}
          ENDSELECT
        ELSE
          SELECT nplan%
          CASE 1
            PRINT #1,"LONG{jedi%}=";
            PRINT #1,SWAP(CARD{alpha%})
            PRINT #1,"LONG{jedi%+4}=0"
          CASE 2
            PRINT #1,"LONG{jedi%}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+4}=0"
          CASE 3
            PRINT #1,"LONG{jedi%}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+4}=";
            PRINT #1,SWAP(CARD{alpha%+4})
          CASE 4
            PRINT #1,"LONG{jedi%}=";
            PRINT #1,LONG{alpha%}
            PRINT #1,"LONG{jedi%+4}=";
            PRINT #1,LONG{alpha%+4}
          ENDSELECT
        ENDIF
      ENDIF
    NEXT col%
  NEXT ligne%
  PRINT #1,"RETURN"
  .
  .D‚calage suivant
  .
NEXT phase%
CLOSE #1
sector_one:
CLS
.
.Centrage de la courbe
.
extreme_x%=SUB(320,sizex%)
extreme_y%=SUB(199,sizey%)
middle_x=extreme_x%/2
middle_y=extreme_y%/2
PRINT "Parametres relatifs a la courbe"
INPUT "Coefficient 1 ";c1%
INPUT "Coefficient 2 ";c2%
INPUT "Coefficient 3 ";c3%
INPUT "Coefficient 4 ";c4%
CLS
.
.Repr‚sentation graphique de la fonction
.
FOR angle%=0 TO 359
  x=middle_x
  x=x+middle_x*COSQ(angle%*c1%)*SINQ(angle%*c2%)
  y=middle_y
  y=y+middle_y*COSQ(angle%*c3%)*SINQ(angle%*c4%)
  VSYNC
  PSET ROUND(x),ROUND(y),15
NEXT angle%
PRINT AT(1,25);"C'est bon ? ( O/N )";
REPEAT
  key$=UPPER$(INPUT$(1))
UNTIL key$="O" OR key$="N"
IF key$="N"
  GOTO sector_one
ENDIF
PRINT AT(1,1);"Entrez le nom du fichier"
PRINT AT(1,2);"destin‚ … recevoir la courbe"
FILESELECT "\*.INL","COURBE.INL",nfile$
nfile$=nfile$+".INL"
IF nfile$=".INL"
  EDIT
ENDIF
.
.Sauvegarde de la courbe
.
OPEN "o",#1,nfile$
FOR angle%=0 TO 359
  PRINT AT(1,3);"Traitement position #";angle%;"/359";
  x=middle_x
  x=x+middle_x*COSQ(angle%*c1%)*SINQ(angle%*c2%)
  y=middle_y
  y=y+middle_y*COSQ(angle%*c3%)*SINQ(angle%*c4%)
  y=MIN(y,extreme_y%)
  adrx%=AND(SHR(ROUND(x),1),65528)
  adry%=MUL(160,ROUND(y))
  adresse%=ADD(adrx%,adry%)
  deca%=AND(ROUND(x),15)
  PRINT #1,MKI$(adresse%);
  PRINT #1,MKI$(SUCC(deca%));
NEXT angle%
CLOSE #1
EDIT

Code:

.
.LISTING 2
.EXEMPLE D'UTILISATION DES ROUTINES
.DE SPRITES MASQUES EN GFA-BASIC
.par Jedi of Sector One from The Heavy Killers
.
.N'oubliez pas de charger l'INLINE !
INLINE courbe%,1440
debut_courbe%=courbe%
fin_courbe%=courbe%+1440
pointeur%=debut_courbe%
.
.Image N‚ochrome … charger
.
OPEN "i",#1,"gen4thk.neo"
SEEK #1,4
pal$=INPUT$(32,#1)
SEEK #1,128
jefond$=INPUT$(32000,#1)
CLOSE #1
VSYNC
FOR a%=0 TO 15
  SETCOLOR a%,0
NEXT a%
SPUT jefond$
CLR jefond$
~XBIOS(6,L:V:pal$)
CLR pal$
OUT 4,&H12
HIDEM
VSYNC
origine%=XBIOS(2)
memoire%=FRE(0)
.
.[ MERGEZ ICI LES RESERVATIONS ]
.
ON BREAK GOSUB bye
.
.Nos deux ‚crans
.
ecran1%=XBIOS(2)
nouveau%=MALLOC(32256)
ecran2%=AND(ADD(nouveau%,255),&HFFFFFF00)
BMOVE ecran1%,ecran2%,32000
.
.Pour la routine 'magique'
old%=ecran2%
old2%=ecran1%
.
.Boucle principale
.
DO
  .
  .Synchronisation sur deux ‚crans
  .
  SWAP ecran1%,ecran2%
  ~XBIOS(5,L:ecran1%,L:ecran2%,-1)
  VSYNC
  jedi%=old%
  .
  .Permuter alternativement les
  .deux buffers de sauvegarde
  .
  IF ecran1%=origine%
    sav%=sav1%
  ELSE
    sav%=sav2%
  ENDIF
  .
  .[ MERGEZ ICI LA ROUTINE DE...
  . ...RESTAURATION DU FOND ]
  .
  jedi%=ADD(ecran1%,CARD{pointeur%})
  deca%=CARD{ADD(pointeur%,2)}
  .
  .Affichage du sprite (d‚calage=deca% ; adresse=jedi%)
  .
  sauve_fond
  ON deca% GOSUB sprite0,sprite1,sprite2,sprite3,sprite4,sprite5,sprite6,sprite7,sprite8,sprite9,sprite10,sprite11,sprite12,sprite13,sprite14,sprite15
  old%=old2%
  old2%=jedi%
  .
  .Positions suivantes
  .
  ADD pointeur%,4
  IF pointeur%=fin_courbe%
    pointeur%=debut_courbe%
  ENDIF
LOOP UNTIL INP?(2)
bye
.
.[ MERGEZ ICI LA ROUTINE D'AFFICHAGE ]
.
.
.[ MERGEZ ICI LA ROUTINE DE...
. ...SAUVEGARDE DU FOND ]
.
PROCEDURE bye
  ~MFREE(nouveau%)
  ~MFREE(sav1%)
  ~MFREE(sav2%)
  RESERVE memoire%
  ~XBIOS(5,L:origine%,L:origine%,0)
  VSYNC
  OUT 4,8
  EDIT
RETURN


C'EST TOUT !

Après avoir étudié les sprites, nous pourrons aborder, tels des
corsaires déchainés, les scrollings de texte ou d'image. D'ici
là, si vous avez des problèmes ou des idées à nous soumettre,
vous pouvez toujours nous laisser un sympathique message sur
l'incommensurable 3615 STMAG en bal SECTOR ONE.
tomchi
tomchi

Messages : 52
Date d'inscription : 15/09/2018
Age : 49

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

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