/****************************************************************************/ /* Cours de programmation graphique */ /* Chapitre 1 */ /* */ /* Shaun "Krashlog" Dore */ /* http://pages.infinit.net/shaun */ /* 3 Avril 1998 */ /* */ /* Note: */ /* ----- */ /* Pour cet exemples, il est necessaire d'utiliser le modele de memoire */ /* Large. Pour se faire Options>Compiler>Code generation : Model Large. */ /* */ /****************************************************************************/ #include #include #include #include #include #define MAX_ETOILES 500 char far *vga = (char far*) MK_FP(0xA000, 0); // pointeur sur memoire video typedef unsigned char byte; // char non signe 0-255 typedef struct type_etoile // pour contenir les infos sur chaque etoiles { int x,y,z; }; /****************************************************************************/ /* SetVGA - Appelle le mode 320x200x256 13h du BIOS */ /****************************************************************************/ void SetVGA() { _AX = 0x0013; geninterrupt (0x10); } /****************************************************************************/ /* Putpixel - Affiche un pixel directement dans la memoire */ /****************************************************************************/ void Putpixel (int x, int y, byte col) { memset(vga+x+(y*320),col,1); } /****************************************************************************/ /* SetText - Appelle le mode texte 03h du BIOS */ /****************************************************************************/ void SetText() { _AX = 0x0003; geninterrupt (0x10); } /****************************************************************************/ /* Cls - Vide l'ecran avec la couleur col */ /****************************************************************************/ void Cls(unsigned char col) { memset(vga,col,0xffff); } /*************************** PROGRAMME PRINCIPAL ****************************/ main() { // Rappel mathematique: % = modulo, le reste de la division entiere // x mod y donne toujours entre 0 et y ex: x % 15 donne toujours // un nombre entre 0 et 15. Bon moyen pour ramener des valeurs dans // un cadre defini. On s'en sert en adressage disperse. int et; byte col; type_etoile etoiles[MAX_ETOILES]; // Tableau d'etoiles du type etoiles // definie plus haut SetText(); printf("*** CHAPITRE 1 - Mode video VGA et Putpixel ***\n\n\n"); printf("Ce programme illustre les differentes notions vues\n"); printf("dans le premier chapitre. Le programme cree un champs\n"); printf("d'etoiles defilantes, ou un starfield en anglais. Pour\n"); printf("debuter, appuyer sur une touche..."); getch(); SetVGA(); randomize(); // Generateur de nombres aleatoires for (int i=0;i<=MAX_ETOILES;i++) // Initialise la structure a 0 { etoiles[i].x = 0; etoiles[i].y = 0; etoiles[i].z = 0; } do // boucle { delay(20); // Modifier la valeur de delay pour modifier la vitesse for (et=0;et