RICO
ricosh@hotmail.com |
l |
|
>0- Introduction |
l | En général lors d'une compilation les 'warning' n'empêchent pas la création de l'exécutable cependant dans le type de programmation que nous allons voir le moindre petit avertissement peut être source de plantage alors faites y attention! De plus ne vous laissez pas impressionner par un plantage, pour tester les programmes de cet article j'ai du planter la machine au moins dix fois.. |
>A- RAPPELS DE NOTIONS UTILES |
>I- Structure des données |
/* Definition d'une structure de nom ess */ typedef /* On defini un type par typedef*/ struct /* debut de la declaration */ { int a; /* 1er champ : un entier */ float b[10]; /* 2eme champ : un tableau de reels */ } ess; /* Le nom du type */ /* Exemple d'utilisation */ void main() { ess d; /* d est de TYPE ess */ d.a= 4; d.b[5]= 2.10; } | l |
typedef struct { int a; float b[10]; } expl; /* Le nom du type */ /* Exemple de passage par arguments */ void fnt( expl * k ) { k->a= 89; /* On utilise -> au lieu de . car k est un pointeur */ k->b[2]= 8.65; } /* Exemples d'utilisation */ void main() { expl d; /* d est de TYPE expl */ fnt( &d ); /* On passe d par ADRESSE */ } | l |
>II- La notion far |
>III- Caractéristiques des tableaux en C (et rien qu'en C/C++ à ma connaissance) |
unsigned char tab[5][6]; | l |
>B- LA PROGRAMMATION (enfin !) |
>I- La structure sprite et les fonctions permettant de l'utiliser |
/* La structure sprite */ typedef struct { int lar; /* Largeur */ int lg; /* Longueur */ unsigned char * des; /* Pointeur sur le tableau contenant le sprite evite les manipulations */ } /* couteuses en temps machine */ sprite; /* ATTENTION a l'ordre pour la largeur et la hauteur dans la déclaration */ /* on definit : unsigned char sp[haut][larg] */ unsigned char sp2[5][6]= {{ 1 , 0 , 0 , 0 , 0 , 1}, { 0 , 1 , 0 , 0 , 0 , 1}, { 0 , 0 , 1 , 0 , 0 , 1}, { 0 , 0 , 0 , 1 , 0 , 1}, { 0 , 0 , 0 , 0 , 1 , 1}, }; /* Creation d'un sprite (un peu limite) */ int creat_spr( sprite * sp , unsigned char * tab , int t_x , int t_y ) { sp->des= tab; /* Declaration simpliste du sprite a remplacer par toute */ /* autre declaration, nottament si le sprite est stocke dans un fichier disque */ sp->lar= t_x; sp->lg= t_y; return 0; /* Tout c'est bien passe, utile si on effectue une allocation, ici ne sert a rien */ } /*Fonction d'affichage de sprites */ /* a oublier vite fait, compte tenu de la future mise en place du buffer */ /* Ceci est donc un EXEMPLE */ void des_spr( int x , int y , sprite * sp ) { int i,j; for( i= 0 ; i | l |
>II- La structure sp_anime |
#define NB_MAX_SPR 10 typedef struct { int cour; /* numero du sprite a afficher la prochaine fois */ int nb; /* nombre de sprites */ sprite * tab[NB_MAX_SPR]; /* Tableau de pointeurs sur sprites */ } sp_anime; /* Fonction d'affichage du sprite anime */ void des_ani( int x , int y , sp_anime * spa ) { des_spr( x , y , spa->tab[ spa->cour ] ); /* Dessine le sprite courant */ spa->cour++; /* incremente le compteur d'animation */ if( spa->cour == spa->nb ) /* verification du debordement du conteur */ spa->cour= 0; } | l |
>III- Les fonctions utilisant le buffer |
>a- définition et création du buffer |
/* Definition du buffer */ unsigned char far * _Buf= NULL; /*note: on ne peut pas creer une variable directement lorsqu'elle*/ /*est declaree 'far'*/ /* Fonction de creation du buffer */ /*ATTENTION a appeller avant ecriture dans le buffer sinon la sanction sera immediate ! */ int cree_buf() { /* Allocation de l'espace necessaire */ /* (unsingned char far *) est un operateur 'cast' = conversion en.. */ _Buf= (unsigned char far *) farmalloc( 64000 ); if( _Buf==NULL ) return 1; /* si l'alloc n'a pas marchee retourne 1 */ else return 0; } /* detruit le buffer */ int del_buf() { if( _Buf == NULL ) /* Si le buffer n'existait pas.. pas besoin de le desallouer */ return 1; farfree( _Buf ); /* Liberation de l'espace */ return 0; } | l |
>b- affichage d'un point dans le buffer |
/* 'Affiche' un pixel dans le buffer */ void bputpixel( int X , int Y , char col ) { _Buf[(Y << 8) + (Y << 6) + X]= col; /* Un peu plus rapide que: y*320+X (methode habituelle)*/ /* '<<' signifie decalage de bits vers la gauche */ } | l |
>c- Affichage du buffer a l'écran |
/* Creation d'un point d'acces a la mem video (en mode 13h) */ /* MK_FP : macro servant a la creation d'un pointeur far: void * MK_FP( int seg , int off ); */ unsigned char far * _Vid= (unsigned char far *) MK_FP( 0xA000 , 0 ); /* Copie du buffer dans la mem video */ void aff_buf() { /* Copie un bloc de 64000 octets de _Buf vers _Vid */ _fmemcpy( _Vid , _Buf , 64000 ); } | l |
>d- effacement du buffer |
/* remplit l'ecran avec la couleur col */ void bclsc( char col ) { _fmemset( _Buf , col , 64000 ); /* Equivalent mais moins rapide : int i,j; for( i=0 ; i<320 ; i++ ) for( j=0 ; j<200 ; j++ ) _Buf[(j << 8) + (j << 6) + i]= col; */ } /* Efface le buffer -> couleur noire (inutile ?) */ void bcls( void ) { bclsc( 0 ); } | l |
>IV- Affichage d'un sprite dans le buffer |
/* On utilise le passage par adresse ( sprite *) pour eviter la 'recopie' du sprite (gain de temps) */ void des_spr( int x , int y , sprite * sp ) { int i,j; for( i= 0 ; i | l |
>V- Affichage d'une anim dans le buffer (Oui, oui c'est la même que plus haut) |
/* Affichage 'automatique' de l'image en cours */ void des_ani( int x , int y , sp_anime * spa ) { /* dessine le sprite */ des_spr( x , y , spa->tab[ spa->cour ] ); /* incrementation de l'image courante */ spa->cour++; if( spa->cour == spa->nb ) spa->cour= 0; } | l |
>VI- Améliorations |
>VII- L'application (téléchargement) |