www.pudn.com > Chap16.rar > Sprite.h
//----------------------------------------------------------------- // Sprite Object // C++ Header - Sprite.h //----------------------------------------------------------------- #pragma once //----------------------------------------------------------------- // Include Files //----------------------------------------------------------------- #include#include "Bitmap.h" //----------------------------------------------------------------- // Custom Data Types //----------------------------------------------------------------- typedef WORD SPRITEACTION; const SPRITEACTION SA_NONE = 0x0000L, SA_KILL = 0x0001L; typedef WORD BOUNDSACTION; const BOUNDSACTION BA_STOP = 0, BA_WRAP = 1, BA_BOUNCE = 2, BA_DIE = 3; //----------------------------------------------------------------- // Sprite Class //----------------------------------------------------------------- class Sprite { protected: // Member Variables Bitmap* m_pBitmap; int m_iNumFrames, m_iCurFrame; int m_iFrameDelay, m_iFrameTrigger; RECT m_rcPosition, m_rcCollision; POINT m_ptVelocity; int m_iZOrder; RECT m_rcBounds; BOUNDSACTION m_baBoundsAction; BOOL m_bHidden; // Helper Methods void UpdateFrame(); virtual void CalcCollisionRect(); public: // Constructor(s)/Destructor Sprite(Bitmap* pBitmap); Sprite(Bitmap* pBitmap, RECT& rcBounds, BOUNDSACTION baBoundsAction = BA_STOP); Sprite(Bitmap* pBitmap, POINT ptPosition, POINT ptVelocity, int iZOrder, RECT& rcBounds, BOUNDSACTION baBoundsAction = BA_STOP); virtual ~Sprite(); // General Methods virtual SPRITEACTION Update(); void Draw(HDC hDC); BOOL IsPointInside(int x, int y); BOOL TestCollision(Sprite* pTestSprite); // Accessor Methods Bitmap* GetBitmap() { return m_pBitmap; }; void SetNumFrames(int iNumFrames); void SetFrameDelay(int iFrameDelay) { m_iFrameDelay = iFrameDelay; }; RECT& GetPosition() { return m_rcPosition; }; void SetPosition(int x, int y); void SetPosition(POINT ptPosition); void SetPosition(RECT& rcPosition); void OffsetPosition(int x, int y); RECT& GetCollision() { return m_rcCollision; }; POINT GetVelocity() { return m_ptVelocity; }; void SetVelocity(int x, int y); void SetVelocity(POINT ptVelocity); BOOL GetZOrder() { return m_iZOrder; }; void SetZOrder(int iZOrder) { m_iZOrder = iZOrder; }; void SetBounds(RECT& rcBounds) { CopyRect(&m_rcBounds, &rcBounds); }; void SetBoundsAction(BOUNDSACTION ba) { m_baBoundsAction = ba; }; BOOL IsHidden() { return m_bHidden; }; void SetHidden(BOOL bHidden) { m_bHidden = bHidden; }; int GetWidth() { return m_pBitmap->GetWidth(); }; int GetHeight() { return (m_pBitmap->GetHeight() / m_iNumFrames); }; }; //----------------------------------------------------------------- // Sprite Inline Helper Methods //----------------------------------------------------------------- inline void Sprite::UpdateFrame() { if ((m_iFrameDelay >= 0) && (--m_iFrameTrigger <= 0)) { // Reset the frame trigger; m_iFrameTrigger = m_iFrameDelay; // Increment the frame if (++m_iCurFrame >= m_iNumFrames) m_iCurFrame = 0; } } inline void Sprite::CalcCollisionRect() { int iXShrink = (m_rcPosition.left - m_rcPosition.right) / 12; int iYShrink = (m_rcPosition.top - m_rcPosition.bottom) / 12; CopyRect(&m_rcCollision, &m_rcPosition); InflateRect(&m_rcCollision, iXShrink, iYShrink); } //----------------------------------------------------------------- // Sprite Inline General Methods //----------------------------------------------------------------- inline BOOL Sprite::TestCollision(Sprite* pTestSprite) { RECT& rcTest = pTestSprite->GetCollision(); return m_rcCollision.left <= rcTest.right && rcTest.left <= m_rcCollision.right && m_rcCollision.top <= rcTest.bottom && rcTest.top <= m_rcCollision.bottom; } inline BOOL Sprite::IsPointInside(int x, int y) { POINT ptPoint; ptPoint.x = x; ptPoint.y = y; return PtInRect(&m_rcPosition, ptPoint); } //----------------------------------------------------------------- // Sprite Inline Accessor Methods //----------------------------------------------------------------- inline void Sprite::SetNumFrames(int iNumFrames) { // Set the number of frames m_iNumFrames = iNumFrames; // Recalculate the position RECT rect = GetPosition(); rect.bottom = rect.top + ((rect.bottom - rect.top) / iNumFrames); SetPosition(rect); } inline void Sprite::SetPosition(int x, int y) { OffsetRect(&m_rcPosition, x - m_rcPosition.left, y - m_rcPosition.top); CalcCollisionRect(); } inline void Sprite::SetPosition(POINT ptPosition) { OffsetRect(&m_rcPosition, ptPosition.x - m_rcPosition.left, ptPosition.y - m_rcPosition.top); CalcCollisionRect(); } inline void Sprite::SetPosition(RECT& rcPosition) { CopyRect(&m_rcPosition, &rcPosition); CalcCollisionRect(); } inline void Sprite::OffsetPosition(int x, int y) { OffsetRect(&m_rcPosition, x, y); CalcCollisionRect(); } inline void Sprite::SetVelocity(int x, int y) { m_ptVelocity.x = x; m_ptVelocity.y = y; } inline void Sprite::SetVelocity(POINT ptVelocity) { m_ptVelocity.x = ptVelocity.x; m_ptVelocity.y = ptVelocity.y; }