home *** CD-ROM | disk | FTP | other *** search
/ Teach Yourself Game Programming in 21 Days / TYGAMES_R.ISO / source / day_10 / tracker.c < prev    next >
Text File  |  1994-06-23  |  8KB  |  364 lines

  1.  
  2.  
  3. // I N C L U D E S ///////////////////////////////////////////////////////////
  4.  
  5. #include <io.h>
  6. #include <conio.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <dos.h>
  10. #include <bios.h>
  11. #include <fcntl.h>
  12. #include <memory.h>
  13. #include <malloc.h>
  14. #include <math.h>
  15. #include <string.h>
  16.  
  17. #include "graph3.h"  // include our graphics stuff
  18. #include "graph4.h"
  19. #include "graph6.h"
  20.  
  21. // P R O T O T Y P E S //////////////////////////////////////////////////////
  22.  
  23. // D E F I N E S /////////////////////////////////////////////////////////////
  24.  
  25. // states that the spider (tracker) can be in
  26.  
  27. #define TRACKER_ATTACK  0   // spider is attacking fly
  28. #define TRACKER_EVADE   1   // spider is evading fly
  29.  
  30. // S T R U C T U R E S ///////////////////////////////////////////////////////
  31.  
  32.  
  33. // G L O B A L S  ////////////////////////////////////////////////////////////
  34.  
  35. pcx_picture imagery_pcx,      // the game imagery
  36.             background_pcx;   // the backdrop
  37.  
  38.  
  39. // the sprites used in the game
  40.  
  41. sprite player,                // the player
  42.        tracker;               // the spider
  43.  
  44. // F U N C T I O N S //////////////////////////////////////////////////////////
  45.  
  46. void main(void)
  47. {
  48. // this is the main function
  49.  
  50. int done=0;       // exit flag for whole system
  51.  
  52. // SECTION 1 /////////////////////////////////////////////////////////////////
  53.  
  54. // set video mode to 320x200 256 color mode
  55.  
  56. Set_Video_Mode(VGA256);
  57.  
  58. // create a double buffer
  59.  
  60. if (!Create_Double_Buffer(SCREEN_HEIGHT))
  61.    {
  62.    printf("\nNot enough memory to create double buffer.");
  63.  
  64.    } // end if
  65.  
  66. // clear the double buffer
  67.  
  68. Fill_Double_Buffer(0);
  69.  
  70. // load in the background image into the double buffer
  71.  
  72. PCX_Init((pcx_picture_ptr)&background_pcx);
  73.  
  74. PCX_Load("trackbak.pcx", (pcx_picture_ptr)&background_pcx,1);
  75.  
  76. // copy the background into the double buffer
  77.  
  78. _fmemcpy((char far *)double_buffer,
  79.          (char far *)(background_pcx.buffer),
  80.          SCREEN_WIDTH*SCREEN_HEIGHT);
  81.  
  82. PCX_Delete((pcx_picture_ptr)&background_pcx);
  83.  
  84. Blit_String_DB(0,0,10,"Press Q to exit, T to toggle mode.",1);
  85.  
  86. // SECTION 2 /////////////////////////////////////////////////////////////////
  87.  
  88. // load in imagery for player
  89.  
  90. PCX_Init((pcx_picture_ptr)&imagery_pcx);
  91.  
  92. PCX_Load("trackimg.pcx", (pcx_picture_ptr)&imagery_pcx,1);
  93.  
  94. // initialize player and extract bitmaps
  95.  
  96. sprite_width  = 24;
  97. sprite_height = 24;
  98.  
  99. Sprite_Init((sprite_ptr)&player,0,0,0,0,0,0);
  100.  
  101. PCX_Grab_Bitmap((pcx_picture_ptr)&imagery_pcx,(sprite_ptr)&player,0,0,0);
  102. PCX_Grab_Bitmap((pcx_picture_ptr)&imagery_pcx,(sprite_ptr)&player,1,1,0);
  103.  
  104. player.x          = 160;
  105. player.y          = 180;
  106. player.curr_frame = 0;
  107. player.state      = 1;
  108.  
  109. // initialize the tracker and extract bitmaps
  110.  
  111. Sprite_Init((sprite_ptr)&tracker,0,0,0,0,0,0);
  112.  
  113. PCX_Grab_Bitmap((pcx_picture_ptr)&imagery_pcx,(sprite_ptr)&tracker,0,0,1);
  114. PCX_Grab_Bitmap((pcx_picture_ptr)&imagery_pcx,(sprite_ptr)&tracker,1,1,1);
  115.  
  116. tracker.x          = 20;
  117. tracker.y          = 20;
  118. tracker.curr_frame = TRACKER_ATTACK;
  119. tracker.state      = TRACKER_ATTACK;
  120.  
  121. // SECTION 3 /////////////////////////////////////////////////////////////////
  122.  
  123. // scan behind all objects before entering event loop
  124.  
  125. Behind_Sprite_DB((sprite_ptr)&player);
  126. Behind_Sprite_DB((sprite_ptr)&tracker);
  127.  
  128. // main event loop
  129.  
  130. while(!done)
  131.      {
  132.  
  133.      // erase all objects
  134.  
  135.      Erase_Sprite_DB((sprite_ptr)&player);
  136.      Erase_Sprite_DB((sprite_ptr)&tracker);
  137.  
  138.      // do movement of spider based on mode
  139.  
  140. // SECTION 4 /////////////////////////////////////////////////////////////////
  141.  
  142.      if (tracker.state==TRACKER_ATTACK)
  143.         {
  144.  
  145.         // move spider toward player
  146.  
  147.         // first take care of X components
  148.  
  149.         if (player.x > tracker.x)
  150.             tracker.x+=2;
  151.         else
  152.         if (player.x < tracker.x)
  153.             tracker.x-=2;
  154.  
  155.         // now Y components
  156.  
  157.         if (player.y > tracker.y)
  158.             tracker.y+=2;
  159.         else
  160.         if (player.y < tracker.y)
  161.             tracker.y-=2;
  162.  
  163.         } // end if spider is attacking
  164.  
  165. // SECTION 5 /////////////////////////////////////////////////////////////////
  166.  
  167.      else
  168.         {
  169.  
  170.         // move spider away from player
  171.  
  172.         // first take care of X components
  173.  
  174.         if (player.x > tracker.x)
  175.             tracker.x-=2;
  176.         else
  177.         if (player.x < tracker.x)
  178.             tracker.x+=2;
  179.  
  180.         // now Y components
  181.  
  182.         if (player.y > tracker.y)
  183.             tracker.y-=2;
  184.         else
  185.         if (player.y < tracker.y)
  186.             tracker.y+=2;
  187.  
  188.         } // end else spider evading
  189.  
  190. // SECTION 6 /////////////////////////////////////////////////////////////////
  191.  
  192.      // do boundary collision for spider
  193.  
  194.      if (tracker.x<0)
  195.          tracker.x = 0;
  196.      else
  197.      if (tracker.x>194)
  198.          tracker.x = 194;
  199.  
  200.      if (tracker.y<0)
  201.          tracker.y = 0;
  202.      else
  203.      if (tracker.y>174)
  204.          tracker.y = 174;
  205.  
  206. // SECTION 7 /////////////////////////////////////////////////////////////////
  207.  
  208.      // see if player is trying to move
  209.  
  210.      if (kbhit())
  211.         {
  212.  
  213.         // which key ?
  214.  
  215.         switch(getch())
  216.               {
  217.  
  218.               // use numeric keypad for movement
  219.               // (note NUMLOCK must be activated)
  220.  
  221.               case '1':     // move down and left
  222.                  {
  223.                  player.x-=4;
  224.                  player.y+=4;
  225.  
  226.                  } break;
  227.  
  228.               case '2':    // move down
  229.                  {
  230.                  player.y+=4;
  231.  
  232.                  } break;
  233.  
  234.               case '3':     // move right and down
  235.                  {
  236.                  player.x+=4;
  237.                  player.y+=4;
  238.  
  239.  
  240.                  } break;
  241.  
  242.               case '4':     // move left
  243.                  {
  244.                  player.x-=4;
  245.  
  246.                  } break;
  247.  
  248.               case '6':    // move right
  249.                  {
  250.                  player.x+=4;
  251.  
  252.                  } break;
  253.  
  254.               case '7':     // move up and left
  255.                  {
  256.  
  257.                  player.x-=4;
  258.                  player.y-=4;
  259.  
  260.                  } break;
  261.  
  262.               case '8':     // move up
  263.                  {
  264.  
  265.                  player.y-=4;
  266.  
  267.                  } break;
  268.  
  269.               case '9':    // move up and right
  270.                  {
  271.  
  272.                  player.x+=4;
  273.                  player.y-=4;
  274.  
  275.                  } break;
  276.  
  277.               case 't': // toggle attack mode
  278.                  {
  279.  
  280.                  if (tracker.state==TRACKER_ATTACK)
  281.                     tracker.state=tracker.curr_frame = TRACKER_EVADE;
  282.                  else
  283.                     tracker.state=tracker.curr_frame = TRACKER_ATTACK;
  284.                  } break;
  285.  
  286.               case 'q': // exit the demo
  287.                  {
  288.                  done = 1;
  289.                  } break;
  290.  
  291.  
  292.               default:break;
  293.  
  294.               } // end switch
  295.  
  296. // SECTION 8 /////////////////////////////////////////////////////////////////
  297.  
  298.         // do boundary collision for player
  299.  
  300.         if (player.x<0)
  301.             player.x = 304;
  302.         else
  303.         if (player.x>304)
  304.             player.x = 0;
  305.  
  306.         if (player.y<0)
  307.             player.y = 184;
  308.         else
  309.         if (player.y>184)
  310.             player.y = 0;
  311.  
  312.         } // end if kbhit
  313.  
  314.  
  315. // SECTION 9 /////////////////////////////////////////////////////////////////
  316.  
  317.      // do animation
  318.  
  319.      if (++player.curr_frame==2)
  320.          player.curr_frame = 0;
  321.  
  322.      // scan background under objects
  323.  
  324.      Behind_Sprite_DB((sprite_ptr)&player);
  325.      Behind_Sprite_DB((sprite_ptr)&tracker);
  326.  
  327.  
  328.      // draw all the imagery
  329.  
  330.      Draw_Sprite_DB((sprite_ptr)&player);
  331.      Draw_Sprite_DB((sprite_ptr)&tracker);
  332.  
  333.  
  334.      // copy the double buffer to the screen
  335.  
  336.      Show_Double_Buffer(double_buffer);
  337.  
  338.      // draw the state of spider on top of video buffer
  339.  
  340.      if (tracker.state == TRACKER_ATTACK)
  341.          Blit_String(8,180,12,"Mode=Attack",1);
  342.      else
  343.          Blit_String(8,180,9,"Mode=Evade",1);
  344.  
  345.      // wait a sec
  346.  
  347.      Delay(1);
  348.  
  349.      } // end while
  350.  
  351. // SECTION 10 ////////////////////////////////////////////////////////////////
  352.  
  353. // reset the video mode back to text
  354.  
  355. Set_Video_Mode(TEXT_MODE);
  356.  
  357. // free the double buffer
  358.  
  359. Delete_Double_Buffer();
  360.  
  361. } // end main
  362.  
  363.  
  364.