INITMAZE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /***********************************************************************
  2. File:   InitMaze.c
  3. Abstract:
  4.     This module contains code to initialize the full maze, as well as the
  5.     data structures associated with it.
  6. Contents:
  7.     InitMaze() -- Inserts subgrids into the Maze array, sets player position
  8.     Calc3DMaze() -- Calculates posts used for drawing 3-d view
  9.     InsertSubGrid() -- copies a sub-grid into the maze
  10. ************************************************************************/
  11. #include "winmaze.h"
  12. #include "mazproto.h"
  13. #include "math.h"
  14. /*=====================================================================
  15. Function: InitMaze()
  16. Inputs: none
  17. Outputs: none
  18. Abstract:
  19.     InitMaze is responsible for initializing the full maze to blocked
  20.     characters, and setting up the temple space.
  21. ======================================================================*/
  22. void InitMaze(
  23.     void
  24.     )
  25. {
  26.     int i,j;
  27.     BYTE b;
  28.     //
  29.     // Initialize the entire maze to being filled already.
  30.     // we'll leave the outer subgrid ring as a buffer.
  31.     //
  32.     b = NORTH | WEST | SOUTH | EAST;
  33.     for(i=0;i<X_SIZE;i++) {
  34.         for (j=0;j<Y_SIZE;j++) {
  35.             bMaze[i][j] = b;
  36.             }
  37.         }
  38.     InsertSubGrid(NUM_PLAYER_SUBGRIDS,6,6);
  39.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+1,7,6);
  40.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+2,5,7);
  41.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+3,6,7);
  42.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+4,7,7);
  43.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+5,6,8);
  44.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+6,7,8);
  45.     //
  46.     // Kludge to start new players out in the sanctuary
  47.     //
  48.     ptSelf.Pos.ix = 6*X_CELLS_PER_SUBGRID+1;
  49.     ptSelf.Pos.iy = 7*Y_CELLS_PER_SUBGRID+1;
  50.     ptSelf.Pos.Facing = NORTH;
  51.     ptLastPos = ptSelf.Pos;
  52.     return;
  53. }
  54. /*=====================================================================
  55. Function: Calc3DMaze()
  56. Inputs: none
  57. Outputs: none
  58. Abstract:
  59.     Calc maze is responsible for recalculating the maze drawing info.
  60.     3-d transformations are done only when the window is resized. The
  61.     results are stored in a table (giving the polygons for each panel, from
  62.     left to right in 2-d coordinates.
  63. ======================================================================*/
  64. void Calc3DMaze(
  65.      )
  66. {
  67.     int i,j,k,width,depth;
  68.     float pw, ph,x[3],y[3], dx, dyh, dyl, dz, dist;
  69.     POINT pCenter;
  70.     float m,b;
  71.     SetCursor(LoadCursor((HINSTANCE)NULL,IDC_WAIT));
  72.     pw = (float) PANEL_WIDTH;
  73.     ph = (float) PANEL_HEIGHT;
  74.     //
  75.     // establish the scale. Should be sufficient to allow the end of the panel
  76.     // we're in to show.  A full panel displayed 1/2 panel away should be 2/3
  77.     // of the screen wide.
  78.     //
  79.     width = (rMaze.right - rMaze.left);
  80.     depth = (rMaze.bottom - rMaze.top);
  81.     //
  82.     // Since scale is used in MC_TO_SC, we need to nullify its effect to set it
  83.     //
  84.     scale = (float) 1.0;
  85.     scale = (float) (.9 * depth/((float)MC_TO_SC(ph,-pw/2)));
  86.     pCenter.x = rMaze.left + width/2;
  87.     pCenter.y = rMaze.top + depth/2;
  88.     //
  89.     // x and y center
  90.     //
  91.     dyl = ph /2;
  92.     dyh = - dyl;
  93.     for(i=0;i<(MAX_DRAW_DIST*2+2);i++) {
  94.         for (j=1;j<(MAX_DRAW_DIST+2);j++) {
  95.             //
  96.             // Calculate post in left position
  97.             //
  98.             dx = (i - (MAX_DRAW_DIST+1)) * pw - pw /2;
  99.             dz = (j-1)*pw - pw/2;
  100.             //
  101.             // left top
  102.             //
  103.             dist = dz;
  104.             pPost[i][j][0].x = pCenter.x + (int) MC_TO_SC(dx,dist);
  105.             pPost[i][j][0].y = pCenter.y + (int) MC_TO_SC(dyh,dist);
  106.             //
  107.             // left bottom
  108.             //
  109.             dist = dz;
  110.             pPost[i][j][1].x = pCenter.x + (int) MC_TO_SC(dx,dist);
  111.             pPost[i][j][1].y = pCenter.y + (int) MC_TO_SC(dyl,dist);
  112.             }
  113.         }
  114.     //
  115.     // Clip as necessary, using line equation: y=mx + b.
  116.     //
  117.     for (i=0,j=0;i<(MAX_DRAW_DIST*2+2);i++) {
  118.         for (k=0;k<2;k++) {
  119.             x[1] = (float) pPost[i][1][k].x;
  120.             x[2] = (float) pPost[i][2][k].x;
  121.             y[1] = (float) pPost[i][1][k].y;
  122.             y[2] = (float) pPost[i][2][k].y;
  123.             m = (y[2] - y[1])/(x[2]-x[1]);
  124.             b = y[1] - m*x[1];
  125.             if (i < MAX_DRAW_DIST+2) {
  126.                 pPost[i][0][k].x = rMaze.left;
  127.                 }
  128.             else {
  129.                 pPost[i][0][k].x = rMaze.right;
  130.                 }
  131.             pPost[i][0][k].y = (int)(m*((float)pPost[i][0][k].x) + b);
  132.             }
  133.         }
  134.     SetCursor(LoadCursor((HINSTANCE)NULL,IDC_ARROW));
  135.     return;
  136. }
  137. /*=====================================================================
  138. Function: InsertSubGrid()
  139. Inputs: # of subgrid, x and y position in maze to insert the subgrid
  140. Outputs: none
  141. Abstract:
  142.     Insert Subgrid will copy the specified subgrid into bMaze, with its upper
  143.     left corner at iXPos*X_CELLS_PER_SUBGRID, iYPos*Y_CELLS_PER_SUBGRID.
  144. ======================================================================*/
  145. void InsertSubGrid(
  146.     int SubGridNo,
  147.     int iXPos,
  148.     int iYPos
  149.     )
  150. {
  151.     int i,j;
  152.     iXPos = iXPos*X_CELLS_PER_SUBGRID;
  153.     iYPos = iYPos*Y_CELLS_PER_SUBGRID;
  154.     for (i=0;i<X_CELLS_PER_SUBGRID;i++) {
  155.         for (j=0;j<Y_CELLS_PER_SUBGRID;j++) {
  156.             bMaze[i+iXPos][j+iYPos] = SubGrids[SubGridNo].Cell[i][j];
  157.             }
  158.         }
  159.     return;
  160. }