home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / sphinx / examples / vga / bounce.c__ next >
Encoding:
Text File  |  1994-03-06  |  6.6 KB  |  254 lines

  1. /*
  2.     SPHINX C-- Example File
  3.     NAME:  BOUNCE.C--
  4.     DESCRIPTION:  This program demonstrates VGA palette cycling, with
  5.                   bouncing lines and boxes, and several fancy methods of 
  6.                   clearing the screen.
  7.     RUNFILE SIZE:  2136 bytes.
  8.     NOTE:  80286 or greater CPU required, and MCGA, VGA or better graphics
  9.            card required.
  10. */
  11.  
  12. ? print "Building BOUNCE.COM, a VGA bouncing line demo.  80286+ required.\n"
  13.  
  14. ? assumeDSSS TRUE        // assume DS == SS 
  15. ? stack 4096             // set stack size
  16. ? resize TRUE            // resize program memory block 
  17. ? use80286               // use 80286 instruction optimization
  18. ? parsecommandline FALSE // don't bother parsing the command line parameters
  19.  
  20. ?include "KEYCODES.H--"   // get k_esc definition
  21. ?include "VIDEO.H--"      // get video mode definitions
  22. ?include "VGA.H--"        // get video mode 19 graphics procedures
  23. ?include "WRITE.H--"      // get WRITESTR procedure
  24. ?include "RANDOM.H--"     // get RAND procedure
  25. ?include "DOS.H--"        // get EXIT procedure
  26.  
  27. ?define CHANGE_RANGE   2    /* random range of palette change */
  28. ?define CLEARTYPES     9    /* number of screen clearing techniques */ 
  29.  
  30. ?define PALSIZE    256*3    /* size of palette buffer 256 colours * RGB */
  31. byte palette[PALSIZE];      /* buffer for palette */
  32.  
  33. ?define XMAX    320  // width of the screen
  34. ?define YMAX    200  // length of the screen
  35. ?define LINESPEED 4  // number of lines to draw before each palette shift
  36. ?define BOXSPEED  6  // number of boxes to draw before each palette shift
  37.  
  38.  
  39. void main()
  40. {
  41. IF( byte @GETCPU() < 2 )    /* check if 80286 instructions available */
  42.     {WRITESTR("80286 or greater CPU required.");
  43.     EXIT(1);}
  44. @ SETVIDEOMODE( vid_320x200_256 );    /* set video mode */
  45. IF(byte @GETVIDEOMODE() != vid_320x200_256)  /* check if entered the mode */
  46.     {WRITESTR("Unable to enter 256 colour mode, VGA required.");
  47.     EXIT(1);}
  48.  
  49. @ RANDOMIZE();   /* seed the random number generator with clock ticks */
  50.  
  51. FANCYCLEAR(7);
  52. do {
  53.     IF( BIOSKEYCHECK() == 0 )
  54.         {IF(RAND()%10 >= 5) 
  55.             fancylines();
  56.         ELSE fancysquares();
  57.         FANCYCLEAR(RAND()%CLEARTYPES); 
  58.         }
  59.     } while( BIOSEREADKEY() <> k_esc );  // keep going until <ESC> is pressed
  60.  
  61. @ SETVIDEOMODE( vid_text80c );    /* return to text mode */
  62. WRITESTR("SPHINX Programming 1994");
  63. }
  64.  
  65.  
  66. void fancylines ()    // do the bouncing lines
  67. byte color,i;
  68. int xloc,yloc;
  69. word xgo,ygo;
  70. int xloc2,yloc2;
  71. word xgo2,ygo2;
  72. {xloc = XMAX /3;
  73. xloc += RAND() % 40;
  74. yloc = YMAX /2;
  75. xloc2 = XMAX /3;
  76. xloc2 += RAND() % 40;
  77. yloc2 = YMAX /3;
  78. yloc2 += RAND() % 40;
  79. xgo = 1;
  80. ygo = 1;
  81. color = 66;
  82. xgo2 = RAND()%2+1;
  83. ygo2 = 1;
  84.  
  85. do {
  86.     i = 0; 
  87.     advancepalette();
  88.     do {
  89.         line19(xloc/4,yloc/4,xloc2/4,yloc2/4,color);
  90.         color--;
  91.         IF( color == 0 )
  92.             color--;
  93.         xloc += xgo;
  94.         yloc += ygo;
  95.         IF( xloc < 0 )
  96.             {xloc -= xgo;
  97.             xgo = RAND()%3+1;}
  98.         IF( xloc >= XMAX*4 )
  99.             {xloc -= xgo;
  100.             xgo = RAND()%3-3;}
  101.         IF( yloc < 0 )
  102.             {yloc -= ygo;
  103.             ygo = RAND()%3+1;}
  104.         IF( yloc >= YMAX*4 )
  105.             {yloc -= ygo;
  106.             ygo = RAND()%3-3;}
  107.         xloc2 += xgo2;
  108.         yloc2 += ygo2;
  109.         IF( xloc2 < 0 )
  110.             {xloc2 -= xgo2;
  111.             xgo2 = RAND()%3+1;}
  112.         IF( xloc2 >= XMAX*4 )
  113.             {xloc2 -= xgo2;
  114.             xgo2 = RAND()%3-3;}
  115.         IF( yloc2 < 0 )
  116.             {yloc2 -= ygo2;
  117.             ygo2 = RAND()%3+1;}
  118.         IF( yloc2 >= YMAX*4 )
  119.             {yloc2 -= ygo2;
  120.             ygo2 = RAND()%3-3;}
  121.         i++;
  122.         } while( i < LINESPEED );
  123.     } while( BIOSEKEYCHECK() == 0 );
  124. }
  125.  
  126.  
  127. void fancysquares ()    // do the bouncing boxes
  128. word xsize,ysize;
  129. byte color;
  130. word xloc,yloc;
  131. int xgo,ygo;
  132. byte i,squares;
  133. word count;
  134. {color = 66;
  135. xgo = 1;
  136. ygo = 1;
  137. squares = RAND() %4;
  138. xsize = RAND() %60 +1;
  139. ysize = xsize;
  140. IF(xsize > 45)
  141.     squares = 0;
  142. xloc = XMAX /3;
  143. xloc += RAND() % 40;
  144. yloc = YMAX /2;
  145.  
  146. do {
  147.     advancepalette();
  148.     i = 0;
  149.     do {
  150.         IF( squares >= 3 )
  151.             box19(xloc,yloc,xsize,ysize,color);
  152.         IF( squares >= 2 )
  153.             box19(XMAX-xloc-xsize,YMAX-yloc-ysize,xsize,ysize,color);
  154.         IF( squares >= 1 )
  155.             box19(xloc,YMAX-xsize-yloc,xsize,ysize,color);
  156.         box19(XMAX-xsize-xloc,yloc,xsize,ysize,color);
  157.         color++;
  158.         IF( color == 0 )
  159.             color++;
  160.         xloc += xgo;
  161.         yloc += ygo;
  162.         AX = XMAX - xsize;
  163.         IF( xloc > AX )
  164.             {-xgo;
  165.             xloc += xgo;
  166.             }
  167.         AX = YMAX - ysize;
  168.         IF( yloc > AX )
  169.             {-ygo;
  170.             yloc += ygo;
  171.             }
  172.         i++;
  173.         } while( i < BOXSPEED );
  174.     } while( BIOSEKEYCHECK() == 0 );
  175. }
  176.  
  177.  
  178. void advancepalette ()   // shift the palette forward one
  179. {@ COPYFAR(DS,#palette[3],DS,#palette[6],PALSIZE-6);
  180. palette[PALSIZE-3] += RAND() % CHANGE_RANGE;
  181. palette[PALSIZE-2] += RAND() % CHANGE_RANGE;
  182. palette[PALSIZE-1] += RAND() % CHANGE_RANGE;
  183. @ WAITVSYNC();
  184. @ SETVGADAC(0, ,PALSIZE, , ,#palette);
  185. }
  186.  
  187.  
  188. void FANCYCLEAR ()   // AL = method to clear the screen by
  189. word i;
  190. {
  191. IF( AL == 0 )
  192.     CLEARSCREEN19();
  193. else IF( AL == 1 )
  194.     {i = 0;
  195.     do {advancepalette();
  196.         line19(0,0,319,i,255-i);
  197.         line19(319,199,0,199-i,255-i);
  198.         i++;
  199.         } while ( i < 200 );
  200.     }
  201. else IF( AL == 2 )
  202.     {i = 0;
  203.     do {advancepalette();
  204.         line19(i,0,i,199,255-i);
  205.         line19(319-i,0,319-i,199,255-i);
  206.         i++;
  207.         } while ( i < 160 );
  208.     }
  209. else IF( AL == 3 )
  210.     {i = 0;
  211.     do {advancepalette();
  212.         line19(0,i,319,i,255-i);
  213.         line19(0,199-i,319,199-i,255-i);
  214.         i++;
  215.         } while ( i < 100 );
  216.     }
  217. else IF( AL == 4 )
  218.     {i = 0;
  219.     do {advancepalette();
  220.         line19(0,i,319,i,255-i);
  221.         i++;
  222.         } while ( i < 200 );
  223.     }
  224. else IF( AL == 5 )
  225.     {i = 0;
  226.     do {advancepalette();
  227.         line19(0,199-i,319,199-i,255-i);
  228.         i++;
  229.         } while ( i < 200 );
  230.     }
  231. else IF( AL == 6 )
  232.     {i = 0;
  233.     do {advancepalette();
  234.         box19(i,i,160-i*2,100-i*2,255-i);
  235.         i++;
  236.         } while( i < 100 );
  237.     }
  238. else IF( AL == 7 )
  239.     {i = 0;
  240.     do {advancepalette();
  241.         bar19(i%16*20,i/16*20,20,20,255-i);
  242.         i++;
  243.         } while( i < 16*10 );
  244.     }
  245. ELSE{i = 0;
  246.     do {advancepalette();
  247.         line19(319,0,0,i,255-i);
  248.         line19(0,199,319,199-i,255-i);
  249.         i++;
  250.         } while ( i < 200 );
  251.     }
  252. }
  253.  
  254. /* end of BOUNCE.C-- */