Magic_Game/Easy2D/Object/Sprite.cpp

142 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
Sprite::Sprite() :
m_nAlpha(255),
m_fScaleX(1),
m_fScaleY(1),
m_pImage(nullptr)
{
}
Sprite::Sprite(Image * image) :
Sprite()
{
setImage(image);
}
Sprite::Sprite(LPCTSTR imageFileName) :
Sprite()
{
setImage(new Image(imageFileName));
}
Sprite::~Sprite()
{
SafeRelease(m_pImage);
}
bool Sprite::_exec(bool active)
{
return false;
}
void Sprite::_onDraw()
{
// display 属性为 false或未设置图片资源时不绘制该图片
if (!m_bDisplay || !m_pImage->m_pCImage)
{
return;
}
// 绘制图片
if (m_pImage->m_pCImage->GetBPP() == 32)
{
m_pImage->m_pCImage->AlphaBlend(GetImageHDC(), getRect(), m_pImage->m_SrcRect, m_nAlpha, AC_SRC_OVER);
}
else
{
m_pImage->m_pCImage->Draw(GetImageHDC(), getRect(), m_pImage->m_SrcRect);
}
}
void Sprite::setImage(Image * image)
{
SafeRelease(m_pImage);
m_pImage = image;
setSize(int(m_pImage->getWidth() * m_fScaleX), int(m_pImage->getHeight() * m_fScaleY));
m_pImage->retain();
}
bool Sprite::isCollisionWith(Sprite * sprite)
{
return IntersectRect(NULL, &getRect(), &sprite->getRect());
}
void Sprite::addAction(Action * action)
{
if (action)
{
// 将动作与 Sprite 绑定
action->m_pTargetSprite = this;
// 将动作加入动作管理器,管理器会处理这个动作
ActionManager::addAction(action);
}
}
void Sprite::resumeAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::resumeAction(action);
}
}
void Sprite::pauseAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::pauseAction(action);
}
}
void Sprite::stopAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::stopAction(action);
}
}
void Sprite::pauseAllActions()
{
ActionManager::pauseSpriteAllActions(this);
}
void Sprite::resumeAllActions()
{
ActionManager::resumeSpriteAllActions(this);
}
void Sprite::stopAllActions()
{
ActionManager::stopSpriteAllActions(this);
}
float Sprite::getScaleX() const
{
return m_fScaleX;
}
float Sprite::getScaleY() const
{
return m_fScaleY;
}
float Sprite::getOpacity() const
{
return m_nAlpha / 255.0f;
}
void Sprite::setScale(float scaleX, float scaleY)
{
m_fScaleX = max(scaleX, 0);
m_fScaleY = max(scaleY, 0);
setSize(int(m_pImage->getWidth() * scaleX), int(m_pImage->getHeight() * scaleY));
}
void Sprite::setOpacity(float opacity)
{
m_nAlpha = BYTE(min(max(opacity, 0), 1) * 255);
}