?? sprite.h
字號:
//-----------------------------------------------------------------
// Sprite Object
// C++ Header - Sprite.h
//-----------------------------------------------------------------
#pragma once
//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include <windows.h>
#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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -