Maze.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. // Maze.cpp: implementation of the CMaze class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "ddutil.h"
  5. #include <list>
  6. #include "Maze.h"
  7. #include <fstream>
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. using namespace std;
  12. CMaze::CMaze(char* pszTextureBMP): m_bDisplayGrid(false),m_pPtDeploy(0)
  13. {
  14. m_pszTextureBMP = pszTextureBMP;
  15. m_szName[0]=0;
  16. }
  17. CMaze::~CMaze()
  18. {
  19. delete[] m_pPtDeploy;
  20. }
  21. bool CMaze::LoadMaze(char *pFilename)
  22. {
  23. fstream MazeData(pFilename,std::ios::in );
  24.     MazeData.getline(m_szName,200);
  25. long nHV;
  26. SMazeCoord MazeCoord;
  27. m_lHLines.erase(m_lHLines.begin(), m_lHLines.end());
  28. m_lVLines.erase(m_lVLines.begin(), m_lVLines.end());
  29. delete[] m_pPtDeploy;
  30. // Read number of horizontal lines
  31. MazeData >> nHV;   // Number of Horizontal rows
  32. for (int nI = 0; nI < nHV; nI++) {
  33. MazeData >> MazeCoord.nY >> MazeCoord.nX1 >> MazeCoord.nX2;
  34. m_lHLines.push_back(MazeCoord);
  35. }
  36. MazeData >> nHV;   // Number of Horizontal rows
  37. for (nI = 0; nI < nHV; nI++) {
  38. MazeData >> MazeCoord.nX >> MazeCoord.nY1 >> MazeCoord.nY2;
  39. m_lVLines.push_back(MazeCoord);
  40. }
  41. MazeData >> m_nNoOfDeployPt; // No of sprite deploy location on the Maze.
  42. m_pPtDeploy = new POINT[m_nNoOfDeployPt];
  43. if (m_pPtDeploy == NULL)
  44. return false;
  45. for (nI = 0; nI < m_nNoOfDeployPt; nI++) {
  46. MazeData >> m_pPtDeploy[nI].x >> m_pPtDeploy[nI].y ;
  47. }
  48. return true;
  49. }
  50. void CMaze::Draw(CSurface *pSurface)
  51. {
  52.     HBITMAP        hBMP = NULL;
  53.     BITMAP         bmp;
  54.     if( pSurface == NULL ) 
  55.         return;
  56. pSurface->Clear(0);
  57.     //  Try to load the bitmap as a resource, if that fails, try it as a file
  58.     hBMP = (HBITMAP) LoadImage( GetModuleHandle(NULL), m_pszTextureBMP, 
  59.                                 IMAGE_BITMAP, 0, 0, 
  60.                                 LR_CREATEDIBSECTION );
  61.     if( hBMP == NULL )
  62.     {
  63.         hBMP = (HBITMAP) LoadImage( NULL, m_pszTextureBMP, 
  64.                                     IMAGE_BITMAP, 0, 0, 
  65.                                     LR_LOADFROMFILE | LR_CREATEDIBSECTION );
  66.         if( hBMP == NULL )
  67.             return;
  68.     }
  69. // Get size of the bitmap
  70.     GetObject( hBMP, sizeof(bmp), &bmp );
  71. m_bmpTexture = bmp;
  72. list<SMazeCoord>::iterator iList;
  73. //Draw horizontal lines
  74. for (iList = m_lHLines.begin(); iList != m_lHLines.end(); iList++) 
  75. {
  76. for (int nI= iList->nX1; nI <= iList->nX2; nI++) {
  77. pSurface->DrawBitmap(hBMP,nI * bmp.bmWidth,iList->nY * bmp.bmHeight, bmp.bmWidth, bmp.bmHeight);
  78. }
  79. }
  80. // Draw vertical lines
  81. for (iList = m_lVLines.begin(); iList != m_lVLines.end(); iList++) 
  82. {
  83. for (int nI= iList->nY1; nI <= iList->nY2; nI++) {
  84. pSurface->DrawBitmap(hBMP,iList->nX * bmp.bmWidth, nI * bmp.bmHeight, bmp.bmWidth, bmp.bmHeight);
  85. }
  86. }
  87. DeleteObject( hBMP );
  88. // Draw grid based on the texture size
  89. if (m_bDisplayGrid) {
  90. POINT p1= {0,0};
  91. POINT p2={0,0};
  92. // Draw horizontal lines
  93. p2.x=pSurface->GetSurfaceDesc().dwWidth;
  94. for (long i= 0 + bmp.bmHeight; i < pSurface->GetSurfaceDesc().dwHeight; i+= bmp.bmHeight) {
  95. p1.y = p2.y=i;
  96. pSurface->DrawLine(p1,p2,RGB(255,0,0));
  97. }
  98.    // Draw vertical lines
  99. p1.y=0;
  100. p2.y=pSurface->GetSurfaceDesc().dwHeight;
  101. for ( i= 0 + bmp.bmWidth; i < pSurface->GetSurfaceDesc().dwWidth; i+= bmp.bmWidth) {
  102. p1.x = p2.x=i;
  103. pSurface->DrawLine(p1,p2,RGB(255,0,0));
  104. }
  105. }
  106. if (m_bDisplayDeploy) {
  107. RECT rc;
  108. for (long i = 0; i < m_nNoOfDeployPt ; i++) {
  109. rc.top = m_pPtDeploy[i].y * bmp.bmHeight;
  110. rc.bottom = rc.top + m_szDeploy.cy;
  111. rc.left = m_pPtDeploy[i].x * bmp.bmWidth;
  112. rc.right = rc.left + m_szDeploy.cx;
  113. pSurface->DrawRect(rc,RGB(0,255,0));
  114. }
  115. }
  116. }
  117.  
  118. void CMaze::DisplayGrid(bool bDisplay /* = false */)
  119. {
  120. m_bDisplayGrid = bDisplay;
  121. }
  122. bool CMaze::IsHit(RECT& rcRect)
  123. {
  124. list<SMazeCoord>::iterator iList;
  125. RECT rcMaze;
  126. RECT rcIntersect;
  127. //Check horizontal lines
  128. for (iList = m_lHLines.begin(); iList != m_lHLines.end(); iList++) 
  129. {
  130. rcMaze.top = iList->nY * m_bmpTexture.bmHeight;
  131. rcMaze.left = iList->nX1 * m_bmpTexture.bmWidth;
  132. rcMaze.bottom = (iList->nY + 1) * m_bmpTexture.bmHeight;
  133. rcMaze.right = (iList->nX2 + 1) * m_bmpTexture.bmWidth;
  134. if (::IntersectRect(&rcIntersect, &rcMaze, &rcRect))
  135. return true;
  136. }
  137. // Check vertical lines
  138. for (iList = m_lVLines.begin(); iList != m_lVLines.end(); iList++) 
  139. {
  140. rcMaze.top = iList->nY1 * m_bmpTexture.bmHeight;
  141. rcMaze.left = iList->nX * m_bmpTexture.bmWidth;
  142. rcMaze.bottom = (iList->nY2 + 1) * m_bmpTexture.bmHeight;
  143. rcMaze.right = (iList->nX + 1) * m_bmpTexture.bmWidth;
  144. if (::IntersectRect(&rcIntersect, &rcMaze, &rcRect))
  145. return true;
  146. }
  147. return false;
  148. }
  149. void CMaze::DisplayDeployRects(SIZE& sz, bool bDisplay)
  150. {
  151. m_szDeploy = sz;
  152. m_bDisplayDeploy = bDisplay;
  153. }
  154. POINT CMaze::GetRandDeployPoint()
  155. {
  156. if (m_pPtDeploy) {
  157. return m_pPtDeploy[rand() % m_nNoOfDeployPt];
  158. } else {
  159. POINT pt = {0,0};
  160. return pt;
  161. }
  162. }
  163. const char* CMaze::GetName()
  164. {
  165. return m_szName;
  166. }
  167. void CMaze::GetPathFindingArray(short* pnPathArray, int nCols)
  168. {
  169. list<SMazeCoord>::iterator iList;
  170. for (iList = m_lHLines.begin(); iList != m_lHLines.end(); iList++) 
  171. {
  172. for (int nI= iList->nX1; nI <= iList->nX2; nI++) {
  173. pnPathArray[iList->nY * nCols + nI ] = 1;
  174. }
  175. }
  176. // Draw vertical lines
  177. for (iList = m_lVLines.begin(); iList != m_lVLines.end(); iList++) 
  178. {
  179. for (int nI= iList->nY1; nI <= iList->nY2; nI++) {
  180. pnPathArray[nI*nCols + iList->nX] = 1;
  181. }
  182. }
  183. }