GameObject.inl
上传用户:royluo
上传日期:2007-01-05
资源大小:1584k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *                                                                             
  3. *   GameObject.inl
  4. *                                                                             
  5. *   Electrical Engineering Faculty - Software Lab                             
  6. *   Spring semester 1998                                                      
  7. *                                                                             
  8. *   Tanks game                                                                
  9. *                                                                             
  10. *   Contents: Inline functions implementations.
  11. *                                                                             
  12. *   Authors: Eran Yariv - 28484475                                           
  13. *            Moshe Zur  - 24070856                                           
  14. *                                                                            
  15. *                                                                            
  16. *   Date: 23/09/98                                                           
  17. *                                                                            
  18. ******************************************************************************/
  19. inline void CGameObject::SetListPosition (POSITION pos)
  20. {
  21.     m_ListPosition = pos;
  22. }
  23. inline POSITION CGameObject::GetListPosition ()
  24. {
  25.     return m_ListPosition;
  26. }
  27. inline void CGameObject::SetArrayPosition (CGameObject** pos)
  28. {
  29.     m_ppArrayPosition = pos;
  30. }
  31. inline CGameObject** CGameObject::GetArrayPosition ()
  32. {
  33.     return m_ppArrayPosition;
  34. }
  35. inline CRect &
  36. CGameObject::GetUpdateRectangle()
  37. {
  38.     return (m_UpdateRect = CRect(m_Pos, m_Size));
  39. }
  40. inline CPoint &
  41. CGameObject::GetPos ()
  42. {
  43.     return m_Pos;
  44. }
  45. inline CSize &
  46. CGameObject::GetDimensions ()
  47. {
  48.     return m_Size;
  49. }
  50. inline UINT
  51. CGameObject::GetID()
  52. {
  53.     // We shouldn't reach this point - this method is just a place holder for the tank object.
  54.     ASSERT(FALSE);  
  55.     return 0;
  56. }
  57. inline void
  58. CGameObject::Kill ()
  59. {
  60.     ASSERT (FALSE); // Must be overridden by derived class if function is to be used.
  61. }
  62. inline void 
  63. CGameObject::SetPos (UINT uXPos, UINT uYPos)
  64. {
  65.     m_Pos.x = uXPos;
  66.     m_Pos.y = uYPos;
  67.     m_bImageChanged = TRUE;
  68. }
  69. inline void 
  70. CGameObject::SetSize (UINT uXSize, UINT uYSize)
  71. {
  72.     m_Size.cx = uXSize;
  73.     m_Size.cy = uYSize;
  74.     m_bImageChanged = TRUE;
  75. }
  76. inline BOOL
  77. CGameObject::HasImageChanged ()
  78. {
  79.     return m_bImageChanged;
  80. }
  81. inline BYTE                
  82. CGameObject::GetSector()
  83. {   // Returns screen sector (0..MAX_SECTOR)
  84.     // Since the X position is 0..MAP_WIDTH-1, it takes MAP_WIDTH_BITS bits to represent on each axis.
  85.     // Shifting (MAP_WIDTH_BITS-2) bits to the right leaves the 2 MSBs intact.
  86.     // Summing the X and Y axis this way gives us the MAX_SECTOR possible sectors.
  87.     return BYTE(((m_Pos.x >> (MAP_WIDTH_BITS-2)) << 2) | (m_Pos.y >> (MAP_HEIGHT_BITS-2)));
  88. }
  89. inline BYTE
  90. CGameObject::GetPosCheckSum()
  91. {   // Returns position checksum within a sector
  92.     // Since the sector number already tells us about the 2 MSBs of each axis.
  93.     // We are left with the MAP_WIDTH_BITS-2 LSBs. 
  94.     // Summing them up on both axis gives a rather unique
  95.     // checksum (with a BYTE overflow).
  96.     // Since this is a descent compiler, the complex expressions below will be consts at run-time.
  97.     return BYTE (BYTE(m_Pos.x & ((1 << (MAP_WIDTH_BITS  - 2)) - 1)) + 
  98.                  BYTE(m_Pos.y & ((1 << (MAP_HEIGHT_BITS - 2)) - 1)));
  99. }
  100. /* ------------------------- Moving object ------------------------- */
  101. inline CMovingGameObject::CMovingGameObject (  UINT uXPos, UINT uYPos, UINT uXSize, UINT uYSize,
  102.                                                UINT uDirectionIndex, 
  103.                                                double dVelocity):
  104.     m_uDirectionIndex (uDirectionIndex),
  105.     m_dVelocity (dVelocity),
  106.     m_uLastTick (0)
  107. {
  108.     SetPos (uXPos, uYPos);
  109.     SetSize (uXSize, uYSize);
  110.     m_PrevPrecPos.dXPos = m_PrecPos.dXPos = m_Pos.x;
  111.     m_PrevPrecPos.dYPos = m_PrecPos.dYPos = m_Pos.y;
  112. }
  113. inline CRect &
  114. CMovingGameObject::GetUpdateRectangle()
  115. {
  116.     CRect PrevRect (CPoint (int(m_PrevPrecPos.dXPos + 0.5), int(m_PrevPrecPos.dYPos + 0.5)), m_Size),
  117.           CurRect  (m_Pos, m_Size);
  118.           
  119.     m_UpdateRect.UnionRect ( PrevRect, CurRect);
  120.     return m_UpdateRect;
  121. }
  122. inline void 
  123. CMovingGameObject::SaveMovement ()
  124. {
  125.     m_PrecPosCopy = m_PrecPos;   
  126.     m_PrevPrecPosCopy = m_PrevPrecPos;
  127.     m_PosCopy = m_Pos;
  128. }
  129. inline void 
  130. CMovingGameObject::UndoMovement ()
  131. {
  132.     m_PrecPos = m_PrecPosCopy;   
  133.     m_PrevPrecPos = m_PrevPrecPosCopy;
  134.     m_Pos = m_PosCopy;
  135.     StopMovement ();
  136. }
  137. inline void 
  138. CMovingGameObject::StopMovement ()
  139. {
  140.     m_uLastTick = 0;
  141. }        
  142. inline void                        
  143. CMovingGameObject::SetNewPos (CPoint &pos)
  144. {
  145.     SetNewPos (pos.x ,pos.y);
  146. }
  147. /* ------------------------- Exploding object ------------------------- */
  148. inline HIMAGE CExplodingGameObject::GetImage()
  149. {
  150.     m_GlobalImageManager.UpdateImage (*m_pCurImage, m_bImageChanged);
  151.     return *m_pCurImage;
  152. }
  153. inline CRect &
  154. CExplodingGameObject::GetUpdateRectangle()
  155. {
  156.     CSize size;
  157.     CPoint offset;
  158.     m_GlobalImageManager.GetImageSize(*m_pCurImage, size);
  159.     m_GlobalImageManager.GetImageOffset(*m_pCurImage, offset);
  160.     m_UpdateRect = CRect (m_Pos + offset, size);
  161.     return m_UpdateRect;
  162. }
  163. inline void
  164. CExplodingGameObject::Explode ()
  165. {
  166.     m_bIsExploding = TRUE;
  167.     m_pCurImage = &m_himgExplode;
  168. }
  169. inline BOOL
  170. CExplodingGameObject::CheckAndSetTankNotification (UINT uTankID)
  171. {
  172.     ASSERT (uTankID < MAX_TANKS);
  173.     BOOL bState = m_bNotifiedTanks[uTankID];
  174.     m_bNotifiedTanks[uTankID] = TRUE;
  175.     return bState;
  176. }
  177. inline BOOL
  178. CExplodingGameObject::IsExplosionOver ()
  179. {
  180.     return (m_bIsExploding &&    // Mine is exploding and after its last frame
  181.             m_GlobalImageManager.ImageEnded ( m_himgExplode ));
  182. }