/* Programme test d'animation en mode X du VGA. Des parties de ce code furent tout d'abord publiées dans PC Techniques. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include #include #include #include "maskim.h" #define SCREEN_SEG 0xA000 #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 #define PAGE0_START_OFFSET 0 #define PAGE1_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH)/4) #define BG_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH*2)/4) #define DOWNLOAD_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH*3)/4) static unsigned int PageStartOffsets[2] = {PAGE0_START_OFFSET,PAGE1_START_OFFSET}; static char GreenAndBrownPattern[] = {2,6,2,6, 6,2,6,2, 2,6,2,6, 6,2,6,2}; static char PineTreePattern[] = {2,2,2,2, 2,6,2,6, 2,2,6,2, 2,2,2,2}; static char BrickPattern[] = {6,6,7,6, 7,7,7,7, 7,6,6,6, 7,7,7,7,}; static char RoofPattern[] = {8,8,8,7, 7,7,7,7, 8,8,8,7, 8,8,8,7}; #define SMOKE_WIDTH 7 #define SMOKE_HEIGHT 7 static char SmokePixels[] = { 0, 0,15,15,15, 0, 0, 0, 7, 7,15,15,15, 0, 8, 7, 7, 7,15,15,15, 8, 7, 7, 7, 7,15,15, 0, 8, 7, 7, 7, 7,15, 0, 0, 8, 7, 7, 7, 0, 0, 0, 0, 8, 8, 0, 0}; static char SmokeMask[] = { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0}; #define KITE_WIDTH 10 #define KITE_HEIGHT 16 static char KitePixels[] = { 0, 0, 0, 0,45, 0, 0, 0, 0, 0, 0, 0, 0,46,46,46, 0, 0, 0, 0, 0, 0,47,47,47,47,47, 0, 0, 0, 0,48,48,48,48,48,48,48, 0, 0, 49,49,49,49,49,49,49,49,49, 0, 0,50,50,50,50,50,50,50, 0, 0, 0,51,51,51,51,51,51,51, 0, 0, 0, 0,52,52,52,52,52, 0, 0, 0, 0, 0,53,53,53,53,53, 0, 0, 0, 0, 0, 0,54,54,54, 0, 0, 0, 0, 0, 0, 0,55,55,55, 0, 0, 0, 0, 0, 0, 0, 0,58, 0, 0, 0, 0, 0, 0, 0, 0, 0,59, 0, 0, 0, 0,66, 0, 0, 0, 0,60, 0, 0,64, 0,65, 0, 0, 0, 0, 0,61, 0, 0,64, 0, 0, 0, 0, 0, 0, 0,62,63, 0,64}; static char KiteMask[] = { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1}; static MaskedImage KiteImage; #define NUM_OBJECTS 20 typedef struct { int X,Y,Width,Height,XDir,YDir,XOtherPage,YOtherPage; MaskedImage *Image; } AnimatedObject; AnimatedObject AnimatedObjects[] = { { 0, 0,KITE_WIDTH,KITE_HEIGHT, 1, 1, 0, 0,&KiteImage}, { 10, 10,KITE_WIDTH,KITE_HEIGHT, 0, 1, 10, 10,&KiteImage}, { 20, 20,KITE_WIDTH,KITE_HEIGHT,-1, 1, 20, 20,&KiteImage}, { 30, 30,KITE_WIDTH,KITE_HEIGHT,-1,-1, 30, 30,&KiteImage}, { 40, 40,KITE_WIDTH,KITE_HEIGHT, 1,-1, 40, 40,&KiteImage}, { 50, 50,KITE_WIDTH,KITE_HEIGHT, 0,-1, 50, 50,&KiteImage}, { 60, 60,KITE_WIDTH,KITE_HEIGHT, 1, 0, 60, 60,&KiteImage}, { 70, 70,KITE_WIDTH,KITE_HEIGHT,-1, 0, 70, 70,&KiteImage}, { 80, 80,KITE_WIDTH,KITE_HEIGHT, 1, 2, 80, 80,&KiteImage}, { 90, 90,KITE_WIDTH,KITE_HEIGHT, 0, 2, 90, 90,&KiteImage}, {100,100,KITE_WIDTH,KITE_HEIGHT,-1, 2,100,100,&KiteImage}, {110,110,KITE_WIDTH,KITE_HEIGHT,-1,-2,110,110,&KiteImage}, {120,120,KITE_WIDTH,KITE_HEIGHT, 1,-2,120,120,&KiteImage}, {130,130,KITE_WIDTH,KITE_HEIGHT, 0,-2,130,130,&KiteImage}, {140,140,KITE_WIDTH,KITE_HEIGHT, 2, 0,140,140,&KiteImage}, {150,150,KITE_WIDTH,KITE_HEIGHT,-2, 0,150,150,&KiteImage}, {160,160,KITE_WIDTH,KITE_HEIGHT, 2, 2,160,160,&KiteImage}, {170,170,KITE_WIDTH,KITE_HEIGHT,-2, 2,170,170,&KiteImage}, {180,180,KITE_WIDTH,KITE_HEIGHT,-2,-2,180,180,&KiteImage}, {190,190,KITE_WIDTH,KITE_HEIGHT, 2,-2,190,190,&KiteImage}, }; void main(void); void DrawBackground(unsigned int); void MoveObject(AnimatedObject *); extern void Set320x240Mode(void); extern void FillRectangleX(int, int, int, int, unsigned int, int); extern void FillPatternX(int, int, int, int, unsigned int, char*); extern void CopySystemToScreenMaskedX(int, int, int, int, int, int, char *, unsigned int, int, int, char *); extern void CopyScreenToScreenX(int, int, int, int, int, int, unsigned int, unsigned int, int, int); extern unsigned int CreateAlignedMaskedImage(MaskedImage *, unsigned int, char *, int, int, char *); extern void CopyScreenToScreenMaskedX(int, int, int, int, int, int, MaskedImage *, unsigned int, int); extern void ShowPage(unsigned int); void main() { int DisplayedPage, NonDisplayedPage, Done, i; union REGS regset; Set320x240Mode(); /* Télécharge l'image du cerf-volant pour la copier vite plus tard */ if (CreateAlignedMaskedImage(&KiteImage, DOWNLOAD_START_OFFSET, KitePixels, KITE_WIDTH, KITE_HEIGHT, KiteMask) == 0) { regset.x.ax = 0x0003; int86(0x10, ®set, ®set); printf("Couldn't get memory\n"); exit(); } /* Affiche le fond sur la page de fond */ DrawBackground(BG_START_OFFSET); /* Copie le fond dans deux pages affichables */ CopyScreenToScreenX(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, BG_START_OFFSET, PAGE0_START_OFFSET, SCREEN_WIDTH, SCREEN_WIDTH); CopyScreenToScreenX(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, BG_START_OFFSET, PAGE1_START_OFFSET, SCREEN_WIDTH, SCREEN_WIDTH); /* Déplace les objets et met à jour les images dans la page non affichée, puis permute la page, jusqu'à ce que Esc est pressée */ Done = DisplayedPage = 0; do { NonDisplayedPage = DisplayedPage ^ 1; /* Efface chaque objet dans la page non affichée en copiant un bloc de la page de fond au dernier emplacement dans cette page */ for (i=0; iX + ObjectToMove->XDir; Y = ObjectToMove->Y + ObjectToMove->YDir; if ((X < 0) || (X > (SCREEN_WIDTH - ObjectToMove->Width))) { ObjectToMove->XDir = -ObjectToMove->XDir; X = ObjectToMove->X + ObjectToMove->XDir; } if ((Y < 0) || (Y > (SCREEN_HEIGHT - ObjectToMove->Height))) { ObjectToMove->YDir = -ObjectToMove->YDir; Y = ObjectToMove->Y + ObjectToMove->YDir; } /* Mémorise l'emplacement précédent pour l'effacement */ ObjectToMove->XOtherPage = ObjectToMove->X; ObjectToMove->YOtherPage = ObjectToMove->Y; ObjectToMove->X = X; /* set new location */ ObjectToMove->Y = Y; }