MirMiniMap.cpp
上传用户:marco7834
上传日期:2010-02-24
资源大小:82k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // MirMiniMap.cpp: implementation of the CMirMiniMap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MirMiniMap.h"
  6. #include <stdio.h>
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. CMirMiniMap::CMirMiniMap()
  11. {
  12. m_fpWilFile = NULL;
  13. m_ImageData = NULL;
  14. m_dwImageWidth = 0;
  15. m_dwImageHeight = 0;
  16. m_dwMapIndex = 0;
  17. m_xpos = 0;
  18. m_ypos = 0;
  19. }
  20. CMirMiniMap::~CMirMiniMap()
  21. {
  22. }
  23. BOOL CMirMiniMap::InitMiniMap(char *wixfile, char *wilfile)
  24. {
  25. m_fpWilFile = fopen( wilfile, "rb" );
  26. if( m_fpWilFile == NULL )
  27. return FALSE;
  28. m_dwCntMMap = LoadOfs( wixfile, &m_pResOfs );
  29. if( m_dwCntMMap == 0 || m_pResOfs == NULL )
  30. return FALSE;
  31. if( !LoadPal( m_BitmapHeader.pals ))
  32. return FALSE;
  33. return TRUE;
  34. }
  35. DWORD CMirMiniMap::LoadOfs( char * szWixFile, DWORD ** ofsbuf )
  36. {
  37. FILE * fp = NULL;
  38. DWORD dwcnt = 0;
  39. fp = fopen( szWixFile, "rb" );
  40. if( fp == NULL )
  41. return 0;
  42. fseek( fp, 0x2c, SEEK_SET );
  43. fread( &dwcnt, 4, 1, fp );
  44. if( dwcnt == 0 )
  45. {
  46. fclose( fp );
  47. return 0;
  48. }
  49. *ofsbuf = new DWORD[dwcnt];
  50. fread( (void*)(*ofsbuf), dwcnt* 4, 1, fp );
  51. fclose( fp );
  52. return dwcnt;
  53. }
  54. char * CMirMiniMap::LoadBuf( DWORD idx, DWORD & width, DWORD & height )
  55. {
  56. char * pData = NULL;
  57. WORD w,h;
  58. DWORD dwSize;
  59. if( m_fpWilFile == NULL )
  60. return NULL;
  61. fseek( m_fpWilFile, m_pResOfs[idx], SEEK_SET );
  62. fread( &w, 2, 1, m_fpWilFile );
  63. if( w == 0 )
  64. {
  65. return NULL;
  66. }
  67. fread( &h, 2, 1, m_fpWilFile );
  68. if( h == 0 )
  69. {
  70. return NULL;
  71. }
  72. width = w;
  73. height = h;
  74. dwSize = width * height;
  75. pData = new char[dwSize];
  76. if( pData == NULL )
  77. return NULL;
  78. fseek( m_fpWilFile, 4, SEEK_CUR );
  79. fread( (void*)pData, dwSize, 1, m_fpWilFile );
  80. return pData;
  81. }
  82. BOOL CMirMiniMap::LoadPal( char * ppal)
  83. {
  84. if( ppal == NULL )
  85. return FALSE;
  86. fseek( m_fpWilFile, 0x38, SEEK_SET );
  87. if( ftell( m_fpWilFile ) != 0x38 )
  88. return FALSE;
  89. fread( (void*)ppal, 1024, 1, m_fpWilFile);
  90. return TRUE;
  91. }
  92. BOOL CMirMiniMap::SetMMap(DWORD index)
  93. {
  94. // BITMAP bm;
  95. if( m_ImageData != NULL )
  96. delete []m_ImageData;
  97. m_ImageData = LoadBuf( index-1, m_dwImageWidth, m_dwImageHeight );
  98. if( m_ImageData == NULL )
  99. return FALSE;
  100. if( m_dwImageWidth == 0 || m_dwImageHeight == 0 )
  101. return FALSE;
  102. BITMAPFILEHEADER bfheader;
  103. MakeBitmapHeader( &bfheader, &m_BitmapHeader.header , m_dwImageWidth, m_dwImageHeight, 8 );
  104. return TRUE;
  105. }
  106. int CMirMiniMap::MakeBitmapHeader( BITMAPFILEHEADER * pBfHeader, BITMAPINFOHEADER * pBiHeader, int width, int height, int bits )
  107. {
  108. int imagesize = width * height * (bits/ 8 );
  109. int headersize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );
  110. memset( (void*)pBfHeader, 0, sizeof( BITMAPFILEHEADER ) );
  111. memset( (void*)pBiHeader, 0, sizeof( BITMAPINFOHEADER ) );
  112. if( bits == 8 )
  113. {
  114. headersize += sizeof( DWORD) * 256;
  115. pBiHeader->biClrImportant = 0x100;
  116. pBiHeader->biClrUsed = 0x100;
  117. }
  118. /*
  119. if( (balian % 4) )
  120. {
  121. imagesize = width * height * ( bits/8  );
  122. }
  123. */
  124. pBfHeader->bfSize = headersize + imagesize;
  125. pBfHeader->bfType = 0x4d42;
  126. pBfHeader->bfOffBits = headersize;
  127. pBiHeader->biWidth = width;
  128. pBiHeader->biHeight = height;
  129. pBiHeader->biBitCount = bits;
  130. pBiHeader->biPlanes = 1;
  131. pBiHeader->biCompression = 0;
  132. pBiHeader->biSize = 40;
  133. pBiHeader->biSizeImage = imagesize;
  134. return 1;
  135. }
  136. void CMirMiniMap::Draw(HDC dc, int x, int y, int w, int h )
  137. {
  138. if( m_ImageData == NULL )
  139. return;
  140. SetDIBitsToDevice( dc, x, y, w, h, (m_xpos + m_xpos/2 ) - (w/2), (m_dwImageHeight - m_ypos - (h/2)), 0, m_dwImageHeight,(void*)m_ImageData, (BITMAPINFO*)&m_BitmapHeader, DIB_RGB_COLORS );
  141. SetPixel( dc, x + w/2,y + h/2, RGB( 255,255,255));
  142. }
  143. void CMirMiniMap::SetCurPos(int x, int y)
  144. {
  145. m_xpos = x;
  146. m_ypos = y;
  147. }