TileSelector.cpp
上传用户:pfmy85
上传日期:2007-01-07
资源大小:22k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // TileSelector.cpp: implementation of the CTileSelector class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Isotest.h"
  6. #include "TileSelector.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CTileSelector::CTileSelector()
  16. {
  17. m_bTop = true;
  18. m_bBottom = false;
  19. m_pArrows = NULL;
  20. m_pTiles = NULL;
  21. m_nCurPos = 0;
  22. // m_pMap = NULL;
  23. }
  24. CTileSelector::~CTileSelector()
  25. {
  26. if (m_pArrows != NULL)
  27. {
  28. delete m_pArrows;
  29. m_pArrows = NULL;
  30. }
  31. // if (m_pMap != NULL)
  32. // {
  33. // delete m_pMap;
  34. // m_pMap = NULL;
  35. // }
  36. }
  37. bool CTileSelector::Create(CDDDevice *pDevice,
  38. CDDSurface* pTiles, // tile source
  39. int nTileWidthShift,
  40. int nTileHeightShift,
  41. LPRECT lpRect, // Display rectangle
  42. LPCTSTR lpName, // Arrows bitmap file name
  43. CPackFileManager* pPackFileManager) // Packfile manager
  44. {
  45. ASSERT(pTiles!=NULL);
  46. m_pTiles = pTiles;
  47. m_pArrows = new CDDDIBSurface;
  48. if (!m_pArrows->Create(pDevice, lpName, pPackFileManager))
  49. return false;
  50. // the arrow bitmap file must contain 4 arrow figure
  51. // one column of four raws
  52. m_nArrowWidth = m_pArrows->GetWidth();
  53. m_nArrowHeight = m_pArrows->GetHeight() >> 2;
  54. m_nTileWidthShift = nTileWidthShift;
  55. m_nTileHeightShift = nTileHeightShift;
  56. m_nTileWidth = 1 << nTileWidthShift;
  57. m_nTileHeight = 1 << nTileHeightShift;
  58. m_nSrcSurfaceCellRows = pTiles->GetWidth() >> nTileWidthShift;
  59. m_nTileCnt = (pTiles->GetWidth() >> nTileWidthShift)
  60. * (pTiles->GetHeight() >> nTileHeightShift);
  61. m_nTotalHeight = m_nTileCnt << m_nTileHeightShift;
  62. m_rcTiles.SetRect(lpRect->left, lpRect->top+m_nArrowHeight,
  63. lpRect->left+m_nArrowWidth, lpRect->bottom-m_nArrowHeight);
  64. m_rect.SetRect(lpRect->left, lpRect->top,
  65. lpRect->left+m_nArrowWidth, lpRect->bottom);
  66. /*
  67. m_pMap = new CDXMap;
  68. if (!m_pMap->Create(pTiles , nTileWidthShift , nTileHeightShift ,
  69. 1, nTileCnt,
  70. 0, lpRect))
  71. return false;
  72. for (int i=0; i<nTileCnt; i++)
  73. m_pMap->SetTile(i, i);
  74. */
  75. return true;
  76. }
  77. void CTileSelector::Draw(CDDSurface* pSurface)
  78. {
  79. CRect rc;
  80. // m_pMap->Draw(pSurface, m_rcTiles);
  81. if (m_bTop)
  82. rc.SetRect(0, 28, 32, 56);
  83. else
  84. rc.SetRect(0, 0, 32, 28);
  85. m_pArrows->Draw(pSurface, m_rect.left, m_rect.top, rc);
  86. if (m_bBottom)
  87. rc.SetRect(0, 84, 32, 112);
  88. else
  89. rc.SetRect(0, 56, 32, 84);
  90. m_pArrows->Draw(pSurface, m_rect.left, m_rect.bottom-28, rc);
  91. int nTileIndex = m_nCurPos >> m_nTileHeightShift;
  92. int nOff = m_rcTiles.top - (m_nCurPos & (m_nTileHeight -1));
  93. CRect rc1;
  94. rc.SetRect(m_rcTiles.left, nOff, m_rcTiles.right, nOff+m_nTileHeight);
  95. while (nOff < m_rcTiles.bottom)
  96. {
  97. rc.SetRect(m_rcTiles.left, nOff, m_rcTiles.right, nOff+m_nTileHeight);
  98. //rc.top = nOff;
  99. //rc.bottom = nOff + m_nTileHeight;
  100. if (!rc1.IntersectRect(rc, m_rcTiles))
  101. break;
  102. int x1, y1;
  103. x1 = (nTileIndex % m_nSrcSurfaceCellRows) << m_nTileWidthShift;
  104. y1 = (nTileIndex / m_nSrcSurfaceCellRows) << m_nTileHeightShift;
  105. rc.left = x1;
  106. rc.right = x1+m_nTileWidth;
  107. rc.top = y1 + (rc1.top - rc.top);
  108. rc.bottom = rc.top + rc1.Height();
  109. m_pTiles->Draw(pSurface, rc1.left, rc1.top, &rc);
  110. nOff += m_nTileHeight;
  111. nTileIndex ++;
  112. }
  113. }
  114. void CTileSelector::Up()
  115. {
  116. m_bBottom = false;
  117. m_nCurPos -= 8;
  118. if (m_nCurPos <= 0)
  119. {
  120. m_nCurPos = 0;
  121. m_bTop = true;
  122. }
  123. else
  124. m_bTop = false;
  125. }
  126. void CTileSelector::Down()
  127. {
  128. m_bTop = false;
  129. m_nCurPos += 8;
  130. if (m_nCurPos >= m_nTotalHeight-m_rcTiles.Height())
  131. {
  132. m_nCurPos = m_nTotalHeight-m_rcTiles.Height();
  133. m_bBottom = true;
  134. }
  135. else
  136. m_bBottom = false;
  137. }
  138. bool CTileSelector::ProcessMouse(int x, int y, // mouse position
  139. CDIMouseState::MOUSE_BUTTON_STATE eMouseState) // mouse button state
  140. {
  141. POINT pt;
  142. pt.x = x;
  143. pt.y = y;
  144. if (!m_rect.PtInRect(pt))
  145. return false;
  146. if (eMouseState == CDIMouseState::MOUSE_BUTTON_0_DOWN)
  147. {
  148. if (y < m_rcTiles.top)
  149. {
  150. Up();
  151. }
  152. else if (y >= m_rcTiles.bottom)
  153. {
  154. Down();
  155. }
  156. else
  157. {
  158. m_nCurTile = ((y-m_rcTiles.top) + m_nCurPos)
  159. >> m_nTileHeightShift;
  160. }
  161. }
  162. return true;
  163. }