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

DirextX编程

开发平台:

Visual C++

  1. // Hero.cpp: implementation of the CHero class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Isotest.h"
  6. #include "Hero.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. const char* CHero::m_szHeroAction[9] ={
  13. "ht","st","wl","fm","lm","qm","as","at","aw"};
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CHero::CHero()
  18. {
  19. for (int e=0; e<ACTION_CNT; e++)
  20. m_pAction[e] = NULL;
  21. m_eAction = ACTION_ST;
  22. m_eDirection = RIGHT_DOWN;
  23. m_nCurFrame = 0;
  24. // test code
  25. m_nPosX = 310;
  26. m_nPosY = 200;
  27. }
  28. CHero::~CHero()
  29. {
  30. for (int e=0; e<ACTION_CNT; e++)
  31. {
  32. if (m_pAction[e]!=NULL)
  33. {
  34. delete m_pAction[e];
  35. m_pAction[e] = NULL;
  36. }
  37. }
  38. }
  39. bool CHero::Create(CDDDevice* pDDDevice,
  40.    LPCTSTR lpszName,
  41.    POINT* pSize,
  42.    CPackFileManager* pPackFileManager/*=NULL*/)
  43. {
  44. ASSERT(pDDDevice!=NULL);
  45. ASSERT(pSize!=NULL);
  46. CString strFile;
  47. memcpy(m_ptSpriteSize, pSize, ACTION_CNT*sizeof(POINT));
  48. for (int i=0; i< ACTION_CNT; i++)
  49. {
  50. strFile.Format("%s%s%s", lpszName, m_szHeroAction[i], ".bmp");
  51. m_pAction[i] = new CDXSprite;
  52. if (m_pAction[i] == NULL)
  53. return false;
  54. if (!m_pAction[i]->Create(pDDDevice, 
  55. strFile,
  56. m_ptSpriteSize[i].x,
  57. m_ptSpriteSize[i].y,
  58. pPackFileManager))
  59. {
  60. delete m_pAction[i];
  61. m_pAction[i] = NULL;
  62. m_nFrames[i] = 0;
  63. }
  64. else
  65. {
  66. // 每个动作有8个方向
  67. // 最后空白帧数不能超过8帧,也就是说精灵原始图
  68. // 列数不能超过8
  69. m_nFrames[i] = m_pAction[i]->GetTotalFrames()/8;
  70. }
  71. }
  72. return true;
  73. }
  74. void CHero::SetViewRect(LPRECT lprcView)
  75. {
  76. ASSERT(lprcView!=NULL);
  77. m_rcView.top = lprcView->top;
  78. m_rcView.left = lprcView->left;
  79. m_rcView.bottom = lprcView->bottom;
  80. m_rcView.right = lprcView->right;
  81. }
  82. bool CHero::SetAction(CHero::HERO_ACTION eAction)
  83. {
  84. if (m_eAction != eAction)
  85. {
  86. m_eAction = eAction;
  87. m_nCurFrame = 0;
  88. return true;
  89. }
  90. return false;
  91. };
  92. bool CHero::SetDirection(DIRECTION eDir)
  93. {
  94. if (eDir != m_eDirection)
  95. {
  96. m_eDirection = eDir;
  97. m_nCurFrame = 0;
  98. return true;
  99. }
  100. return false;
  101. }
  102. void CHero::SetPos(int x, int y)
  103. {
  104. m_nPosX = x;
  105. m_nPosY = y;
  106. };
  107. void CHero::Move(CDXIsoMap* pMap, DIRECTION eDir)
  108. {
  109. int nx, ny, nTx, nTy;
  110. switch (eDir)
  111. {
  112. case DOWN:
  113. ny = m_nPosY +1;
  114. break;
  115. case LEFT_DOWN:
  116. nx = m_nPosX - 2;
  117. ny = m_nPosY + 1;
  118. break;
  119. case LEFT:
  120. nx = m_nPosX - 2;
  121. break;
  122. case LEFT_UP:
  123. nx = m_nPosX - 2;
  124. ny = m_nPosY - 1;
  125. break;
  126. case UP:
  127. ny = m_nPosY - 1;
  128. break;
  129. case RIGHT_UP:
  130. nx = m_nPosX + 2;
  131. ny = m_nPosY - 1;
  132. break;
  133. case RIGHT:
  134. nx = m_nPosX + 2;
  135. break;
  136. case RIGHT_DOWN:
  137. nx = m_nPosX + 2;
  138. ny = m_nPosY + 1;
  139. break;
  140. }
  141. pMap->AbsoluteCell(nx, ny, nTx, nTy, FALSE);
  142. CELL* pCell = pMap->GetCell(nTx, nTy);
  143. if (((pCell->base.flag & CDXIsoMap::m_CellRmrFlg) == 0)
  144. && ((pCell->base.flag & CDXIsoMap::m_CellRmrFlg) == 0))
  145. pMap->Scroll(eDir);
  146. }
  147. void CHero::Draw(CDDSurface* pDestSurface, LPRECT pRect/*=NULL*/)
  148. {
  149. if (m_pAction[m_eAction] == NULL)
  150. return;
  151. m_pAction[m_eAction]->SetFrame(m_nFrames[m_eAction] * m_eDirection
  152. + m_nCurFrame);
  153. m_pAction[m_eAction]->MoveTo(
  154. m_nPosX - (m_ptSpriteSize[m_eAction].x >> 1),
  155. m_nPosY - m_ptSpriteSize[m_eAction].y+16);
  156. if (pRect==NULL)
  157. m_pAction[m_eAction]->Draw(pDestSurface, &m_rcView);
  158. else
  159. m_pAction[m_eAction]->Draw(pDestSurface, pRect);
  160. }
  161. void CHero::ServeIt(__int64 nTime)
  162. {
  163. static __int64 nLastTime = 0;
  164. const __int64 nTimeSpan = 0x10000;
  165. if ((nTime - nLastTime) > nTimeSpan)
  166. {
  167. nLastTime = nTime;
  168. }
  169. else
  170. return;
  171. m_nCurFrame++;
  172. if (m_nCurFrame>= m_nFrames[m_eAction])
  173. {
  174. switch (m_eAction)
  175. {
  176. case ACTION_AT:
  177. case ACTION_FM:
  178. case ACTION_LM:
  179. case ACTION_QM:
  180. case ACTION_HT:
  181. m_eAction = ACTION_AS;
  182. break;
  183. default:
  184. break;
  185. }
  186. m_nCurFrame = 0;
  187. }
  188. }