home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / SCROLL2.ZIP / SCROLL2.C < prev    next >
C/C++ Source or Header  |  1994-01-16  |  4KB  |  128 lines

  1. #include <stdio.h>
  2. // This is a simple program to demonstrate one way to scroll a page
  3. // up or down using mode X.
  4.  
  5. // Modified to create a outrun type road scroller??
  6.  
  7. // To compile it use large model and link with xlib06l.lib, one idea
  8. // to make things speed up is to modify the page flip routine source
  9. // and remove all loops (I believe there are two). This can make the
  10. // difference between 30fps and 60fps!!
  11.  
  12. // Enjoy.
  13.  
  14. #include <stdlib.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include <alloc.h>
  18. #include <dos.h>
  19. #include <bios.h>
  20. #include <time.h>
  21. #include "xlib_all.h"
  22.  
  23. #define FARPTR(x) (MK_FP(FP_SEG(x),FP_OFF(x)))
  24.  
  25. void load_pallete(void);
  26. void load_mapsprites(void);
  27. void put_map(int);
  28.  
  29. char far * Sprite[1];     // Sprite table
  30. int        counter;       // Global counter
  31. char       buff[5000];    // Temporary buffer for loading sprites
  32.  
  33. char far *        // from xlib6
  34. AllocatedSprite(int width, int height, int logical_width, char far * bitmap)
  35. {
  36.     char far * result;
  37.     int size;
  38.     result = farmalloc((width * height * 7) / 2 + 25);
  39.     if (result == 0) {printf("\n out of memory \n");exit(0);}
  40.     size = x_compile_bitmap_32(logical_width, bitmap, result);
  41.     return farrealloc(result, size);
  42. }
  43.  
  44. void load_pallete()     // load pallete from raw file
  45. {
  46.    FILE *k;
  47.    int i;
  48.    unsigned char r,g,b;
  49.    k = fopen("mac.pal","rb");
  50.    for (i=0; i<256; i++){
  51.       r = fgetc(k);
  52.       g = fgetc(k);
  53.       b = fgetc(k);
  54.       x_set_rgb(i,r,g,b);
  55.    }
  56.    x_set_rgb(0,0,0,0);
  57.    fclose(k);
  58. }
  59.  
  60. void load_mapsprites()
  61. {
  62.  FILE *k;
  63.  int i,l;
  64.  unsigned char c;
  65.  k=fopen("tile.vsp","rb");
  66.  for (l=0; l<=1; l++){      // loop for the number of sprites to load
  67.     for (i=0; i<4; i++)
  68.        fgetc(k);            // strip size header
  69.     for (i=2;i<18;i++)      // make first line all 0's -- why? I dont know it just works better, expirimentation is great!!
  70.        buff[i] = 0;
  71.     for (i=18;i<274;i++)    // actually read spite data
  72.        buff[i] = fgetc(k);
  73.     buff[0] = 16;           // set up sizes for compilation
  74.     buff[1] = 17;
  75.     Sprite[l] = AllocatedSprite(buff[0], buff[1], 80,FARPTR(buff)); // compile it
  76.  }
  77.  fclose(k);
  78. }
  79.  
  80. void put_map(int i)
  81. {
  82.    register int k,j,r;
  83.    r = (16 - (i % 16))+16;  // compute offset of tiles to screen
  84.    for (j=0;j<21;j++)
  85.       for (k=0;k<16;k++)
  86.      x_put_cbitmap((j << 4),(k<<4)+r,HiddenPageOffs,Sprite[0]);
  87. }
  88.  
  89. void put_road(int i)
  90. {
  91.    int k,j,c;
  92.    k = 130;  // starting point
  93.    c = 0;
  94.    do {
  95.       for (j=0;j<20;j++) { // modify this to use your own mapping ie. road layout or what ever
  96.      if ((i-c+j) % 20 == 0) x_put_cbitmap((j << 4),k,HiddenPageOffs,Sprite[1]);
  97.      else x_put_cbitmap((j << 4),k,HiddenPageOffs,Sprite[0]);
  98.       }
  99.       k += c; // modify this for elevation
  100.       c++; // use mod function to modify tiling ie. if (i % 2 == 1) c++;
  101.    } while (k < 280);
  102. }
  103.  
  104. main()
  105. {
  106.    struct time begin,end;
  107.    int i=0;
  108.    load_mapsprites();                 // load sprite(s)
  109.    free(buff);                        // free sprite buffer
  110.    x_set_mode(1,320);                 // set X mode
  111.    load_pallete();                    // load pallete
  112.    x_set_tripplebuffer(798);          // set up triple buffer
  113.    gettime(&begin);                   // get start time
  114.    do {                               // loop
  115.       put_road(i++);                     // draw a page
  116.       x_page_flip(0,32);                 // look at page just drawn
  117.       counter++;                         // inc global counter
  118.    } while (!kbhit());                // until anykey hit
  119.    gettime(&end);                     // get end time
  120.    x_text_mode();                     // exit X mode
  121.    printf("number of frames = %d\n",counter);   // figure it all out
  122.    printf("begin time       = %d - %d - %d\n",begin.ti_min,begin.ti_sec,begin.ti_hund);
  123.    printf("end time         = %d - %d - %d\n",end.ti_min,end.ti_sec,end.ti_hund);
  124.    printf("frame rate       = %d\n",
  125.       counter/(((end.ti_hour*360)+(end.ti_min*60)+(end.ti_sec)+(end.ti_hund/100))-
  126.       ((begin.ti_hour*360)+(begin.ti_min*60)+(begin.ti_sec)+(begin.ti_hund/100))));
  127.    return(0);
  128. }