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

游戏引擎

开发平台:

Visual C++

  1. // MirGameMap.cpp: implementation of the CMirGameMap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MirGameMap.h"
  6. #include <stdio.h>
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. CMirGameMap::CMirGameMap()
  11. {
  12. m_pData = 0;
  13. m_DrawWidth = 16;
  14. m_DrawHeight = 16;
  15. m_DrawMapWidth = 11;
  16. m_DrawMapHeight = 11;
  17. memset( &m_Header, 0, sizeof( m_Header ) );
  18. }
  19. CMirGameMap::~CMirGameMap()
  20. {
  21. if( m_pData != 0 )
  22. delete []m_pData;
  23. }
  24. void CMirGameMap::Draw(HDC dc, int dx, int dy)
  25. {
  26. int i = 0;
  27. int j = 0;
  28. if( m_pData == NULL )
  29. return;
  30. //HPEN hp = CreatePen( PS_SOLID, 4, RGB( 0, 0, 255 ));
  31. HBRUSH hbrold = (HBRUSH)GetCurrentObject( dc, OBJ_BRUSH );
  32. LOGBRUSH lb;
  33. lb.lbColor = RGB( 255, 0, 0 );
  34. lb.lbStyle = BS_SOLID;
  35. lb.lbHatch = 0;
  36. HBRUSH hbr1 = CreateBrushIndirect( &lb );
  37. lb.lbColor = RGB( 255, 255, 255 );
  38. HBRUSH hbr2 = CreateBrushIndirect( &lb );
  39. lb.lbColor = RGB( 0, 0, 255 );
  40. HBRUSH hbr3 = CreateBrushIndirect( &lb );
  41. for( i = 0;i < m_DrawMapWidth;i ++ )
  42. {
  43. for( j = 0;j < m_DrawMapHeight;j ++ )
  44. {
  45. if( TestMap( i + m_xpos - m_DrawMapWidth/2, j + m_ypos-m_DrawMapHeight/2))
  46. {
  47. SelectObject( dc, hbr2 );
  48. }
  49. else
  50. {
  51. SelectObject( dc, hbr1 );
  52. }
  53. PatBlt( dc, i * m_DrawWidth + dx, j * m_DrawHeight + dy, m_DrawWidth, m_DrawHeight, PATCOPY );
  54. }
  55. }
  56. SelectObject( dc, hbr3 );
  57. PatBlt( dc, (m_DrawMapWidth / 2 ) * m_DrawWidth + dx, ( m_DrawMapHeight / 2 ) * m_DrawHeight + dy, m_DrawWidth, m_DrawHeight, PATCOPY );
  58. SelectObject( dc, hbrold );
  59. DeleteObject( hbr1 );
  60. DeleteObject( hbr2 );
  61. DeleteObject( hbr3 );
  62. }
  63. BOOL CMirGameMap::SetGameMap(char *mapname, DWORD x, DWORD y)
  64. {
  65. if( m_pData != NULL )
  66. delete []m_pData;
  67. m_pData = Loadmap( mapname );
  68. if( m_pData == NULL )
  69. return FALSE;
  70. m_xpos = x;
  71. m_ypos = y;
  72. return TRUE;
  73. }
  74. MIRMAPBLOCK* CMirGameMap::Loadmap(char *map)
  75. {
  76. char tmpFilename[256];
  77. FILE * fpmap = NULL;
  78. MIRMAPBLOCK * pdata = NULL;
  79. DWORD dsize  = 0;
  80. sprintf( tmpFilename, "%s.map", map );
  81. fpmap = fopen( tmpFilename, "rb" );
  82. if( fpmap == NULL )
  83. {
  84. sprintf( tmpFilename, "map\%s.map", map );
  85. fpmap = fopen( tmpFilename, "rb" );
  86. if( fpmap == NULL )
  87. {
  88. MessageBox( 0, "未发现传奇地图信息,自动寻路功能和怪物行动预测功能将无法使用。", "提示", 0 );
  89. return NULL;
  90. }
  91. }
  92. fread( &m_Header, sizeof( MIRMAPHEADER), 1, fpmap );
  93. if( m_Header.height == 0 || m_Header.width == 0 )
  94. return NULL;
  95. dsize = m_Header.width;
  96. dsize *= m_Header.height;
  97. pdata = new MIRMAPBLOCK[dsize];
  98. if( pdata == NULL )
  99. return NULL;
  100. fread( (void*)pdata, dsize * sizeof( MIRMAPBLOCK ), 1, fpmap );
  101. fclose( fpmap );
  102. return pdata;
  103. }
  104. void CMirGameMap::SetPersonInfo(DWORD x, DWORD y, DWORD dir)
  105. {
  106. m_xpos = x;
  107. m_ypos = y;
  108. m_dir = dir;
  109. }
  110. int xofs_walk2[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
  111. int yofs_walk2[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
  112. BOOL CMirGameMap::TestMapTo(int x, int y, int dir)
  113. {
  114. int tx, ty;
  115. if( dir < 0 || dir > 7 )
  116. return FALSE;
  117. tx = x + xofs_walk2[dir];
  118. ty = y + yofs_walk2[dir];
  119. return TestMap(tx,ty);
  120. }
  121. BOOL CMirGameMap::TestMap(int x, int y)
  122. {
  123. if( x >= m_Header.width || y >= m_Header.height || x < 0 || y < 0 )
  124. {
  125. return FALSE;
  126. }
  127. if( m_pData == NULL )
  128. return TRUE;
  129. if( m_pData[x * m_Header.height + y].tile & 0x8000 )
  130. {
  131. return FALSE;
  132. }
  133. return TRUE;
  134. }