[ < - retour au sommaire - > ]

 

 

I. Djgpp, quoi qu'est-ce ?

Très simplement, et pour aller vite (petite formule bidon ne voulant rien dire, utilisée pour faire augmenter la taille de mon article... tout comme cette parenthèse...) on peut dire que Djgpp est un compilateur C gratuit, sous Dos, accompagné de moultes utilitaires fort sympathiques. "DJGPP est un ensemble d'applicatifs gratuits permettant de developper des programmes C/C++ en mode protégé 32 bits sous MS-DOS.", nous dit la faq traduite de l'anglais par François Charton. Nous, on va s'intéresser uniquement au C et à la programmation graphique avec l'extrrrraordinaire librairie Allegro. La version 3.1 est disponible sur le site de son auteur, Shawn Hargreaves, à cette adresse : http://www.talula.demon.co.uk/ , mais pour ce qu'on va faire, la version 3.0 suffira. Pour ceux qui liraient cet article en vue de se lancer dans la programmation de démos, sachez que les productions du groupe Knights sont réalisées avec ces outils...

II. Où ?

Djgpp est disponible dans toutes les bonnes crèmeries, mais surtout à ftp://ftp.ibp.fr/pub/simtelnet/ gnu/djgpp . Mais comme vous n'avez pas envie d'engraisser France Telecom (non, vous n'avez pas envie...) vous ne voudrez pas tout télécharger. De toutes façons, tout n'est pas nécessaire. Donc, si vous voulez savoir quoi télécharger, rendez vous sur le site de Guillaume Betous (ne paniquez pas, l'adresse est plus bas...;-) ) qui explique également la procédure d'installation. Sinon, plus simple et moins couteux (sauf peut-être pour les veinards qui sont cablés), sachez que la version 2.01 de djgpp et la version 3.0 d'Allegro, (ce sont celles que j'utilise) sont disponibles sur le cd pro de Pc Team n°33.

III. Piti historique de cette rubrique.

Au début, je comptais faire une rubrique traitant d'une initiation à la programmation graphique avec Djgpp et Allegro. Mais le fait est que certaines personnes ayant un cerveau plus rapide que le mien ont eu l'idée de le faire avant moi. Guillaume Betous en praticulier, qui fait ça très bien. Du coup, on ne traitera pas ici des bases de la programmation, ni de l'installation de djgpp. Nan. Pour ces choses, mieux vaut, si vous voulez APPRENDRE quelque chose (ça risque pas d'arriver avec Peuw!) aller sur le site de la personne sus-citée, à http://members.tripod.com/~betous . Donc, la rubrique en est réduite à ce principe: à chaque numéro, on décortiquera le code source d'un effet bien connu. Cela dit, si vous débutez, (et même si vous êtes confirmés, ça vous fera réviser...) je vous conseille FORTEMENT d'aller sur le site de Guillaume Betous pour faire vos premières armes... et même un peu plus.

IV. Premier effet: le feu.

Evidemment, le feu, tout le monde le fait, dans tous les webzines. Bah oui. Et nous on va faire pareil. Le feu, ça à l'air ringard comme ça, mais pensez que l'algo peut servir de base pour construire d'autres effets plus intéressants. (on en reparlera à la fin de l'article) Sachez, pour vot' culture, que c'est le coder espagnol Jare qui, le premier, a réalisé cet effet. Vous pouvez télécharger un fichier zip conteant le source, l'image contenant la palette et l'exécutable, ( 149 ko ) ou bien seulement le source et l'image ( 1,16 ko ).

Le principe

On utilise l'image précédente pour passer à la suivante. Chaque pixel de la nouvelle image va en fait recevoir la moyenne de la valeur des pixels environnants de l'image précédente. (cette valeur correspond à une couleur dans la palette, sachant que de 0 à 79, on va des couleurs froides vers les couleurs chaudes, et qu'après c'est du blanc jusqu'à la dernière couleur, c'est-à-dire la couleur 255.) De plus, cette moyenne sera décrémentée de 1 si elle est supérieure à zéro. En ce qui concerne le choix des "pixels environnants" pour le calcul de la moyenne, on peut varier la chose pour obtenir des effets un peu différents... à vous d'expérimenter. Evidemment, si on fait une moyenne et qu'on ne rajoute pas de pixels à couleurs "chaudes" en bas de l'écran, le feu va vite mourir... On va donc mettre des couleurs chaudes au hasard sur les trois dernières lignes. En complément, pour obtenir une certaine "turbulence" du feu, on rajoutera des foyers sur ces mêmes lignes à des emplacements choisis au hasard. Les foyers seront représentés par des carrés blancs (valeur 255, pour qu'on n'arrive pas trop vite aux couleurs froides) de 3 pixels de côté.

 

  #include "allegro.h"

char foyer [4096];
int posfoyer [4096];

void fire(BITMAP *destination)
{
int i, nb_foyers, pixel, rnd, x, y;

for(x=0;x<320;x++)
{
for(y=197;y<200;y++)
{
rnd = random() % 4096;
destination->line[y][x] = ((posfoyer[rnd] & 15) + 64);
}
}

nb_foyers = foyer[rnd];

for(i=0;i<nb_foyers;i++)
{
x=posfoyer[rnd];
rnd = random() % 4096;

for(y=197;y<200;y++)
{
destination->line[y][x] = 255;
destination->line[y][x+1] = 255;
destination->line[y][x-1] = 255;
}
}

for(y=100;y<198;y++)
{
for(x=0;x<320;x++)
{
pixel = ((destination->line[y][x-1] +
destination->line[y][x+1] +
destination->line[y][x] +
destination->line[y+1][x+1] +
destination->line[y+1][x-1] +
destination->line[y+2][x] +
destination->line[y+2][x+1] +
destination->line[y+2][x-1] ) >> 3);

if(pixel!=0)
pixel--;

destination->line[y][x] = pixel;
}
}
}

void main(void)
{
BITMAP *the_image ;
BITMAP *the_buffer ;
PALLETE the_palette;
char pcx_name[80] ;
int i ;

allegro_init();
set_gfx_mode(GFX_VGA, 320, 200, 0, 0);
install_keyboard();

for(i=0;i<4096;i++) {
foyer[i] = (char) (random() % 35);
posfoyer[i] = (int) (random() % 320);
}

strcpy(get_filename(pcx_name), "pal.pcx");
the_image = load_pcx(pcx_name, the_palette);
if (!the_image) {
printf("Error reading bitmap file");
}

set_pallete(the_palette);
destroy_bitmap(the_image);

the_buffer = create_bitmap(320,200);
clear(the_buffer);

while(!keypressed())
{
fire(the_buffer);
vsync();
blit(the_buffer,screen,0,0,0,6,320,194);
}

destroy_bitmap(the_buffer);
set_gfx_mode(GFX_TEXT, 80, 25, 0, 0);
printf("Rrrraaaahhh y'a le feu !!! \n\n\n");
}

inclusion de la librairie Allegro

tableau de valeurs aléatoires entre 0 et 35
tableau de valeurs aléatoires entre 0 et 320

destination pointe vers un buffer de 320x200



de 0 à 319 (la longueur d'une ligne de l'écran)

on traite les trois dernières lignes

rnd = un nombre au hasard entre 0 et 4096
destination(x,y) = un nombre au hasard entre 64 et 79. (avec le "& 15", on s'assure que le nombre ne dépasse pas 15, et avec le "+ 64" on arrive à l'intervalle voulu.)
nb_foyers = le nombre de foyers, au hasard entre 0 et 35
de 0 jusqu'au nombre de foyers

position du foyer au hasard
rnd = un nombre au hasard entre 0 et 4096

on traite les trois dernières lignes

destination(x,y) = 255 (du blanc)
destination(x+1,y) = 255 (du blanc)
destination(x+2,y) = 255 (du blanc)
de façon à créer un carré blanc de 3 pixels de côté

on ne traite que le moitié inférieure de l'écran, car le feu ne monte pas juqu'en haut...
de 0 à 319 (une ligne fait 320 pixels de long)

on fait la moyenne des pixels environnant le pixel courant (pas tout à fait ceux qui sont autour, mais bon...) et on la divise par 8, ce qui revient à décaler les bits de 3 rangs vers la droite, d'où le ">> 3". Ensuite, si pixel est différent de 0, (en fait, on veut juste savoir s'il est supérieur à 0, mais tester la non-égalité est suffisant, vu que pixel ne peut être négatif, car il n'y a aucun membre négatif dans le calcul... vous me suivez ?) on le décrémente et on l'écrit en destination(x,y).






la procédure principale

un buffer pour l'image qui contient la palette
un buffer pour l'effet
la palette



démarrer Allegro
mode 13h (320x200 en 256 couleurs)
on installe la gestion du clavier d'Allegro

initialisation des tableaux de chiffres aléatoires
nombres entre 0 et 35
nombres entre 0 et 320


procédure de chargement de l'image. retenez-là, c'est à peu près tout le temps la même. s'il y a un problème, le programme s'arrête et affiche un message d'erreur.


on sélectionne la palette
on peut détruire le buffer qui contenait l'image, car il ne nous sert plus
the_buffer est un buffer de 320x200 pixels
on le nettoie

tant qu'on ne presse pas de touche
on applique la procédure "fire" à "the_buffer"
on se synchronise avec l'écran pour éviter le scintillement, puis on copie le buffer dans l'écran. Notez qu'on ne copie pas les 6 dernières lignes, qui ne sont pas très jolies. (essayez, vous verrez...)
fin du programme: on détruit le buffer pour libérer la mémoire, on repasse en mode texte et on affiche une idiotie...

 

 

Variations

Comme je le disais tout à l'heure, cet effet peut servir de base à d'autres effets. Déjà, on peut bidouiller une peu la palette, pour voir ce que ça donne. Je vous conseille à ce sujet l' utilitaire GrafX2, par Sunset Design , qui gère vraiment très bien ce genre d'opérations. De plus plus vous pouvez varier le calcul de la moyenne, en choisissant d'autres pixels, en en prenant moins... Par exemple, on peut bidouiller une routine de disparition d'image. Faites une image en noir et blanc (la palette doit être un dégradé d'UNE couleur, la couleur étant en 255 et le noir en 0) avec par exemple un texte au centre. Dans le code, supprimez la partie qui gère "l'entretien" du feu, et hop, vous avez une effet de disparition de texte très... moche, oui je sais, mais bon, ça n'est qu'un exemple... Que vous pourrez d'ailleurs télécharger ici, avec l'exécutable (150 ko) ou sans (4,05 ko).

J'espère ne pas vous avoir avoir trop embrouillés et si vous n'avez pas compris, n'hésitez pas à m'écrire!

Mr Gone