Obligement - L'Amiga au maximum

Mardi 03 juin 2025 - 20:06  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : GFA Basic - Conversion de fichiers IFF en BOB ou sprites
(Article écrit par Stéphane Schreiber et extrait d'Amiga News Tech - janvier 1991)


L'application GFA Basic de ce mois-ci découle d'une idée toute bête : pourquoi ne pas utiliser Deluxe Paint pour créer tous les objets graphiques - BOB et sprites en particulier - dont on peut avoir tôt ou tard grand besoin ?

Parce que je ne sais pas pour vous, mais moi, depuis le temps, j'en étais encore à utiliser cette ignominie d'ObjEdit fourni avec le bon vieil AmigaBasic des familles. Remarquez, ce programme possède un avantage certain : il sauvegarde des fichiers sprites - ou BOB, c'est pareil - directement exploitables par l'instruction OBJECT.SHAPE, instruction qui, dans sa version GFA Basic, est parfaitement compatible avec celle de l'AmigaBasic. C'était toujours ça de pris. Seulement, il faut bien reconnaître que question dessin, Deluxe Paint est encore ce qui se fait de mieux ; aucune comparaison possible en tout cas avec ObjEdit. Du coup, je me suis dit qu'en écrivant une routine de conversion des fichiers IFF en fichiers BOB ou sprites, puisque je vous dis que c'est pareil, j'arriverai peut-être à créer des graphismes dignes de mon talent. Donc acte.

Passe-moi la brosse à reluire

Le programme qui suit est ma foi fort simple, tout autant que son mode d'emploi. Le désormais célèbre FileRequester apparaît, dans lequel on sélectionne le nom du fichier IFF à convertir. Il est préférable que ce fichier soit une brosse que vous aurez au préalable découpée sous Deluxe Paint, vu que le programme convertit le fichier IFF en BOB sans se soucier une seule seconde de sa taille. Si vous voulez vous dessiner des BOB de la taille de l'écran, rien ne vous en empêche. Une fois toutes les opérations correctement effectuées, un nouveau fichier est créé du même nom que le premier, mais avec l'extension ".BOB" ou ".SPRITE" en sus.

Du côté des gadgets, il vous est possible de sauvegarder la palette séparément, pour la récupérer dans vos programmes plus tard ; dans ce cas, un second fichier est également créé, d'extension ".PAL". Pour ceux que les détails sordides intéressent réellement, je suis obligé d'avouer ne pas connaître ni d'Adam, ni d'Eve, ni de qui que ce soit d'autre le format exact des chaînes de caractères utilisées dans l'instruction OBJECT.SHAPE. M'enfin, qu'à cela ne tienne, il suffisait de regarder le listing d'ObjEdit pour faire exactement la même chose que lui, tout pareil.

La routine de lecture d'une image IFF est quant à elle légèrement plus intéressante. C'est d'ailleurs elle qui occupe la quasi-totalité de ce listing, c'est tout dire. Signalons pour ceux qui se sentiraient concernés, que je me contente de lire les blocs de données BMHD (bitmap header pour les intimes), CAMG, BODY et CMAP, ce dernier n'étant pas obligatoire (alors que les trois premiers, si). La routine s'étend de la ligne "WHILE NOT EOF(#1)" jusqu'à la ligne "CLOSE #1" incluses. Les plus curieux peuvent toujours aller la disséquer un peu, voire l'améliorer, je n'ai jamais prétendu posséder la science infuse...

CLEAR
ON BREAK GOSUB broken
OPTION BASE 0
'
FILESELECT "Nom du fichier IFF ILBM ? ","OK Boss","",image_iff$
IF LEN(image_iff$) AND EXIST(image_iff$)
  OPEN "i",#1,image_iff$
  IF INPUT$(4,#1)="FORM"
    form_length%=CVL(INPUT$(4,#1))
    IF INPUT$(4,#1)="ILBM"
      flags&=0
      WHILE NOT EOF(#1)
        chunk_name$=INPUT$(4,#1)
        chunk_length%=CVL(INPUT$(4,#1))
        SELECT chunk_name$
        CASE "BMHD"
          flags&=BSET(flags&,0)
          width&=CVI(INPUT$(2,#1))
          height&=CVI(INPUT$(2,#1))
          x&=CVI(INPUT$(2,#1))
          y&=CVI(INPUT$(2,#1))
          n_planes&=ASC(INPUT$(1,#1))
          masking&=ASC(INPUT$(1,#1))
          compression&=ASC(INPUT$(1,#1))
          pad&=ASC(INPUT$(1,#1))
          transparent_color&=CVI(INPUT$(2,#1))
          x_aspect&=ASC(INPUT$(1,#1))
          y_aspect&=ASC(INPUT$(1,#1))
          page_width&=CVI(INPUT$(2,#1))
          page_height&=CVI(INPUT$(2,#1))
          IF page_width&=0
            SELECT width&
            CASE 1 TO 320
              page_width&=320
            CASE 321 TO 640
              page_width&=640
            DEFAULT
              page_width&=width&
            ENDSELECT
          ENDIF
          IF page_height&=0
            SELECT height&
            CASE 1 TO 256
              page_height&=256
            CASE 257 TO 512
              page_height&=512
            DEFAULT
              page_height&=height&
            ENDSELECT
          ENDIF
        CASE "BODY"
          flags&=BSET(flags&,1)
          body%=AllocMem(chunk_length%,&H10001) ! Public, Clear
          IF body%
            body_length%=chunk_length%
            BGET #1,body%,body_length%
          ELSE
            ALERT 1,"Pas de mémoire pour|charger le BODY",3,"Zob",dummy&
            END
          ENDIF
        CASE "CAMG"
          flags&=BSET(flags&,2)
          view_modes%=CVL(INPUT$(4,#1))
        CASE "CMAP"
          flags&=BSET(flags&,3)
          nb_coul&=DIV(chunk_length%,3)
          DIM coul&(nb_coul&)
          FOR i&=0 TO PRED(nb_coul&)
            coul&(i&)=SHL(ASC(INPUT$(1,#1)),4) OR ASC(INPUT$(1,#1)) OR SHR(ASC(INPUT$(1,#1)),4)
          NEXT i&
        DEFAULT
          RELSEEK #1,chunk_length% ! Ignore le chunk
        ENDSELECT
        IF ODD(chunk_length%) ! Si longueur impaire
          RELSEEK #1,1
        ENDIF
      WEND
      CLOSE #1
      ' Il faut au moins le BMHD, le CAMG et le BODY pour décompacter l'image
      IF flags& AND &X111
        OPENS 1,0,0,page_width&,page_height&+11,n_planes&,view_modes%
        OPENW #1,0,0,page_width&,page_height&+11,0,&H21D00
        ~SetWindowTitles(WINDOW(1),0,0)
        IF flags& AND &X1000
          ~LoadRGB4(ViewPortAddress(WINDOW(1)),VARPTR(coul&(0)),nb_coul&)
        ELSE
          ALERT 1,"Pas de ColorMap",1,"Ah bon ?",dummy&
        ENDIF
        src%=body%
        rastport%=SCREEN(1)+84
        bitmap%=LONG{rastport%+4}
        DIM bitplane%(n_planes&-1,height&-1)
        longueur_ligne&=@row_bytes(page_width&)
        FOR i&=0 TO PRED(n_planes&)
          FOR j&=0 TO PRED(height&)
            bitplane%(i&,j&)=LONG{bitmap%+8+(i&*4)}+((j&+11)*longueur_ligne&)
          NEXT j&
        NEXT i&
        IF compression&
          longueur_ligne&=@row_bytes(width&)
          FOR ligne&=0 TO PRED(height&)
            FOR plan&=0 TO PRED(n_planes&)
              dest%=bitplane%(plan&,ligne&)
              ll&=longueur_ligne&
              WHILE ll&>0
                n&=PEEK(src%) ! Octet de contrôle
                INC src%
                IF n&<128 ! suivi de (n+1) octets de données
                  INC n&
                  SUB ll&,n&
                  BMOVE src%,dest%,n&
                  ADD src%,n&
                  ADD dest%,n&
                ELSE IF n&<>128 ! répète l'octet suivant (-n)+1 fois
                  n&=256-n&+1
                  SUB ll&,n&
                  a&=PEEK(src%)
                  INC src%
                  DO
                    POKE dest%,a&
                    INC dest%
                    DEC n&
                  LOOP WHILE n&>0
                ENDIF
              WEND
            NEXT plan&
          NEXT ligne&
        ELSE
          ' image non compressée
          size%=@row_bytes(width&)
          FOR ligne&=0 TO PRED(height&)
            FOR plan&=0 TO PRED(n_planes&)
              BMOVE src%,bitplane%(plan&,ligne&),size%
              ADD src%,size%
            NEXT plan&
          NEXT ligne&
        ENDIF
        '
        fvsprite&=0
        fichier_bob$=image_iff$+".BOB"
        IF width&<=16
          ALERT 1,"Créer un Bob ou un Sprite ?",1,"Bob|Sprite",r&
          IF r&=1
            fvsprite&=1
            fichier_bob$=image_iff$+".SPRITE"
          ENDIF
        ENDIF
        OPEN "o",#2,fichier_bob$
        PRINT #2,MKL$(0);               ! ColorSet
        PRINT #2,MKL$(0);               ! DataSet
        PRINT #2,MKI$(n_planes&);       ! Profondeur
        PRINT #2,MKI$(width&);          ! Largeur
        PRINT #2,MKI$(height&);         ! Hauteur
        PRINT #2,MKI$(fvsprite&+24);    ! Flags : SAVEBACK + OVERLAY + fvsprite
        PRINT #2,MKI$(2^n_planes&-1);   ! PlanePick
        PRINT #2,MKI$(0);               ! PlaneOnOff
        FOR plan&=0 TO PRED(n_planes&)  ! Plans de bits
          FOR ligne&=0 TO PRED(height&)
            BPUT #2,bitplane%(plan&,ligne&),@row_bytes(width&)
          NEXT ligne&
        NEXT plan&
        IF fvsprite&
          PRINT #2,MKI$(coul&(1));
          PRINT #2,MKI$(coul&(2));
          PRINT #2,MKI$(coul&(3));
        ENDIF
        CLOSE #2
        '
        OPEN "o",#3,image_iff$+".PAL"
        BPUT #3,V:coul&(0),nb_coul&*2
        CLOSE #3
        '
        CLOSEW #1
        CLOSES 1
      ELSE
        ALERT 1,image_iff$+"|est incomplet.|Décompactage impossible.",1,"Prout",dummy&
        CLOSE #1
      ENDIF
      IF body%
        ~FreeMem(body%,body_length%)
        CLR body%
      ENDIF
    ELSE
      ALERT 1,image_iff$+"|n'est pas un fichier ILBM",1,"Crotte",dummy&
      END
    ENDIF
  ELSE
    ALERT 1,image_iff$+"|n'est pas un fichier IFF",1,"Zut",dummy&
    END
  ENDIF
ENDIF
EDIT
'
FUNCTION row_bytes(row_pixels&)
  RETURN SHL(SHR(ADD(row_pixels&,15),4),1)
ENDFUNC
'
PROCEDURE broken
  CLOSEW #1
  CLOSES 1
  IF body%
    ~FreeMem(body%,body_length%)
  ENDIF
  EDIT
RETURN



[Retour en haut] / [Retour aux articles]