新增Sprite裁剪函数,修复了最小化窗口时cpu占用高的bug
This commit is contained in:
parent
0689e1b0e9
commit
ecc1cbffce
|
|
@ -254,10 +254,11 @@ void e2d::EApp::_mainLoop()
|
||||||
// 判断间隔时间是否足够
|
// 判断间隔时间是否足够
|
||||||
if (nInterval >= nAnimationInterval)
|
if (nInterval >= nAnimationInterval)
|
||||||
{
|
{
|
||||||
|
// 记录当前时间
|
||||||
|
tLast = GetNow();
|
||||||
|
|
||||||
if (!m_bPaused)
|
if (!m_bPaused)
|
||||||
{
|
{
|
||||||
// 记录当前时间
|
|
||||||
tLast = GetNow();
|
|
||||||
// 游戏控制流程
|
// 游戏控制流程
|
||||||
_onControl();
|
_onControl();
|
||||||
// 刷新游戏画面
|
// 刷新游戏画面
|
||||||
|
|
|
||||||
|
|
@ -164,13 +164,13 @@ void e2d::ENode::_updateTransformToReal()
|
||||||
{
|
{
|
||||||
// 计算锚点坐标
|
// 计算锚点坐标
|
||||||
D2D1_POINT_2F anchorPos = D2D1::Point2F(
|
D2D1_POINT_2F anchorPos = D2D1::Point2F(
|
||||||
m_Size.width * m_fAnchorX,
|
getRealWidth() * m_fAnchorX,
|
||||||
m_Size.height * m_fAnchorY
|
getRealHeight() * m_fAnchorY
|
||||||
);
|
);
|
||||||
// 计算左上角坐标
|
// 计算左上角坐标
|
||||||
D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(
|
D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(
|
||||||
m_Pos.x - m_Size.width * m_fAnchorX,
|
m_Pos.x - getRealWidth() * m_fAnchorX,
|
||||||
m_Pos.y - m_Size.height * m_fAnchorY
|
m_Pos.y - getRealHeight() * m_fAnchorY
|
||||||
);
|
);
|
||||||
// 二维矩形变换
|
// 二维矩形变换
|
||||||
m_Matri = D2D1::Matrix3x2F::Scale(
|
m_Matri = D2D1::Matrix3x2F::Scale(
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,11 @@ static ID2D1Bitmap * GetBitmapFromResource(const e2d::EString & resourceName, co
|
||||||
|
|
||||||
|
|
||||||
e2d::ESprite::ESprite()
|
e2d::ESprite::ESprite()
|
||||||
|
: m_pBitmap(nullptr)
|
||||||
|
, m_fSourcePosX(0)
|
||||||
|
, m_fSourcePosY(0)
|
||||||
|
, m_fSourceWidth(0)
|
||||||
|
, m_fSourceHeight(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,12 +42,66 @@ e2d::ESprite::ESprite(const EString & imageFileName)
|
||||||
setImage(imageFileName);
|
setImage(imageFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e2d::ESprite::ESprite(const EString & imageFileName, float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
setImage(imageFileName);
|
||||||
|
clipImage(x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
e2d::ESprite::ESprite(const EString & resourceName, const EString & resourceType)
|
e2d::ESprite::ESprite(const EString & resourceName, const EString & resourceType)
|
||||||
: ESprite()
|
: ESprite()
|
||||||
{
|
{
|
||||||
setImage(resourceName, resourceType);
|
setImage(resourceName, resourceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e2d::ESprite::ESprite(const EString & resourceName, const EString & resourceType, float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
setImage(resourceName, resourceType);
|
||||||
|
clipImage(x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
float e2d::ESprite::getWidth() const
|
||||||
|
{
|
||||||
|
return m_fSourceWidth * m_fScaleX;
|
||||||
|
}
|
||||||
|
|
||||||
|
float e2d::ESprite::getHeight() const
|
||||||
|
{
|
||||||
|
return m_fSourceHeight * m_fScaleY;
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::ESize e2d::ESprite::getSize() const
|
||||||
|
{
|
||||||
|
return ESize(getWidth(), getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
float e2d::ESprite::getRealWidth() const
|
||||||
|
{
|
||||||
|
return m_fSourceWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
float e2d::ESprite::getRealHeight() const
|
||||||
|
{
|
||||||
|
return m_fSourceHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::ESize e2d::ESprite::getRealSize() const
|
||||||
|
{
|
||||||
|
return ESize(m_fSourceWidth, m_fSourceHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::setWidth(float)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::setHeight(float)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::setSize(float, float)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void e2d::ESprite::setImage(const EString & fileName)
|
void e2d::ESprite::setImage(const EString & fileName)
|
||||||
{
|
{
|
||||||
WARN_IF(fileName.empty(), "ESprite cannot load bitmap from NULL file name.");
|
WARN_IF(fileName.empty(), "ESprite cannot load bitmap from NULL file name.");
|
||||||
|
|
@ -52,12 +111,20 @@ void e2d::ESprite::setImage(const EString & fileName)
|
||||||
|
|
||||||
m_sFileName = fileName;
|
m_sFileName = fileName;
|
||||||
|
|
||||||
SafeReleaseInterface(&pBitmap);
|
SafeReleaseInterface(&m_pBitmap);
|
||||||
pBitmap = GetBitmapFromFile(m_sFileName);
|
m_pBitmap = GetBitmapFromFile(m_sFileName);
|
||||||
|
|
||||||
ASSERT(pBitmap, "ESprite create device resources failed!");
|
ASSERT(m_pBitmap, "ESprite create device resources failed!");
|
||||||
|
|
||||||
this->setSize(pBitmap->GetSize().width, pBitmap->GetSize().height);
|
m_fSourcePosX = m_fSourcePosY = 0;
|
||||||
|
m_fSourceWidth = m_pBitmap->GetSize().width;
|
||||||
|
m_fSourceHeight = m_pBitmap->GetSize().height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::setImage(const EString & fileName, float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
setImage(fileName);
|
||||||
|
clipImage(x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ESprite::setImage(const EString & resourceName, const EString & resourceType)
|
void e2d::ESprite::setImage(const EString & resourceName, const EString & resourceType)
|
||||||
|
|
@ -76,23 +143,41 @@ void e2d::ESprite::setImage(const EString & resourceName, const EString & resour
|
||||||
m_sResourceName = resourceName;
|
m_sResourceName = resourceName;
|
||||||
m_sResourceType = resourceType;
|
m_sResourceType = resourceType;
|
||||||
|
|
||||||
SafeReleaseInterface(&pBitmap);
|
SafeReleaseInterface(&m_pBitmap);
|
||||||
pBitmap = GetBitmapFromResource(resourceName, resourceType);
|
m_pBitmap = GetBitmapFromResource(resourceName, resourceType);
|
||||||
|
|
||||||
ASSERT(pBitmap, "ESprite create device resources failed!");
|
ASSERT(m_pBitmap, "ESprite create device resources failed!");
|
||||||
|
|
||||||
this->setSize(pBitmap->GetSize().width, pBitmap->GetSize().height);
|
m_fSourcePosX = m_fSourcePosY = 0;
|
||||||
|
m_fSourceWidth = m_pBitmap->GetSize().width;
|
||||||
|
m_fSourceHeight = m_pBitmap->GetSize().height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::setImage(const EString & resourceName, const EString & resourceType, float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
setImage(resourceName, resourceType);
|
||||||
|
clipImage(x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::ESprite::clipImage(float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
m_fSourcePosX = max(x, 0);
|
||||||
|
m_fSourcePosY = max(y, 0);
|
||||||
|
m_fSourceWidth = min(max(width, 0), m_pBitmap->GetSize().width - m_fSourcePosX);
|
||||||
|
m_fSourceHeight = min(max(height, 0), m_pBitmap->GetSize().width - m_fSourcePosX);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ESprite::_onRender()
|
void e2d::ESprite::_onRender()
|
||||||
{
|
{
|
||||||
if (pBitmap)
|
if (m_pBitmap)
|
||||||
{
|
{
|
||||||
// Draw bitmap
|
// Draw bitmap
|
||||||
GetRenderTarget()->DrawBitmap(
|
GetRenderTarget()->DrawBitmap(
|
||||||
pBitmap,
|
m_pBitmap,
|
||||||
D2D1::RectF(0, 0, getRealWidth(), getRealHeight()),
|
D2D1::RectF(0, 0, m_fSourceWidth, m_fSourceHeight),
|
||||||
m_fDisplayOpacity
|
m_fDisplayOpacity,
|
||||||
|
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
|
||||||
|
D2D1::RectF(m_fSourcePosX, m_fSourcePosY, m_fSourceWidth, m_fSourceHeight)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,16 @@ struct EPoint
|
||||||
this->y = y;
|
this->y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EPoint operator + (EPoint const & p)
|
||||||
|
{
|
||||||
|
return EPoint(x + p.x, y + p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
EPoint operator - (EPoint const & p)
|
||||||
|
{
|
||||||
|
return EPoint(x - p.x, y - p.y);
|
||||||
|
}
|
||||||
|
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
};
|
};
|
||||||
|
|
@ -46,6 +56,16 @@ struct ESize
|
||||||
this->height = height;
|
this->height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ESize operator + (ESize const & size)
|
||||||
|
{
|
||||||
|
return ESize(width + size.width, height + size.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESize operator - (ESize const & size)
|
||||||
|
{
|
||||||
|
return ESize(width - size.width, height - size.height);
|
||||||
|
}
|
||||||
|
|
||||||
float width;
|
float width;
|
||||||
float height;
|
float height;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -52,5 +52,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define DEPRECATED_ATTRIBUTE __declspec(deprecated)
|
||||||
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline void SafeDelete(T** p) { if (*p) { delete *p; *p = nullptr; } }
|
inline void SafeDelete(T** p) { if (*p) { delete *p; *p = nullptr; } }
|
||||||
|
|
@ -368,23 +368,96 @@ public:
|
||||||
const EString & imageFileName
|
const EString & imageFileName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 从文件图片创建精灵并裁剪
|
||||||
|
ESprite(
|
||||||
|
const EString & imageFileName,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float width,
|
||||||
|
float height
|
||||||
|
);
|
||||||
|
|
||||||
// 从资源图片创建精灵
|
// 从资源图片创建精灵
|
||||||
ESprite(
|
ESprite(
|
||||||
const EString & resourceName,
|
const EString & resourceName,
|
||||||
const EString & resourceType
|
const EString & resourceType
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 从资源图片创建精灵并裁剪
|
||||||
|
ESprite(
|
||||||
|
const EString & resourceName,
|
||||||
|
const EString & resourceType,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float width,
|
||||||
|
float height
|
||||||
|
);
|
||||||
|
|
||||||
|
// 获取精灵宽度
|
||||||
|
virtual float getWidth() const override;
|
||||||
|
|
||||||
|
// 获取精灵高度
|
||||||
|
virtual float getHeight() const override;
|
||||||
|
|
||||||
|
// 获取精灵大小
|
||||||
|
virtual ESize getSize() const override;
|
||||||
|
|
||||||
|
// 获取精灵宽度(不考虑缩放)
|
||||||
|
virtual float getRealWidth() const override;
|
||||||
|
|
||||||
|
// 获取精灵高度(不考虑缩放)
|
||||||
|
virtual float getRealHeight() const override;
|
||||||
|
|
||||||
|
// 获取精灵大小(不考虑缩放)
|
||||||
|
virtual ESize getRealSize() const override;
|
||||||
|
|
||||||
|
// 设置精灵宽度是失效的
|
||||||
|
virtual void setWidth(float) override;
|
||||||
|
|
||||||
|
// 设置精灵高度是失效的
|
||||||
|
virtual void setHeight(float) override;
|
||||||
|
|
||||||
|
// 设置精灵大小是失效的
|
||||||
|
virtual void setSize(float, float) override;
|
||||||
|
|
||||||
// 从文件加载图片
|
// 从文件加载图片
|
||||||
void setImage(
|
void setImage(
|
||||||
const EString & fileName
|
const EString & fileName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 从文件加载图片并裁剪
|
||||||
|
void setImage(
|
||||||
|
const EString & fileName,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float width,
|
||||||
|
float height
|
||||||
|
);
|
||||||
|
|
||||||
// 从资源加载图片
|
// 从资源加载图片
|
||||||
void setImage(
|
void setImage(
|
||||||
const EString & resourceName,
|
const EString & resourceName,
|
||||||
const EString & resourceType
|
const EString & resourceType
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 从资源加载图片并裁剪
|
||||||
|
void setImage(
|
||||||
|
const EString & resourceName,
|
||||||
|
const EString & resourceType,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float width,
|
||||||
|
float height
|
||||||
|
);
|
||||||
|
|
||||||
|
// 裁剪原图片
|
||||||
|
void clipImage(
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float width,
|
||||||
|
float height
|
||||||
|
);
|
||||||
|
|
||||||
// 预加载资源
|
// 预加载资源
|
||||||
static bool preloadImage(
|
static bool preloadImage(
|
||||||
const EString & fileName
|
const EString & fileName
|
||||||
|
|
@ -404,10 +477,14 @@ protected:
|
||||||
virtual void _onRender() override;
|
virtual void _onRender() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
float m_fSourcePosX;
|
||||||
|
float m_fSourcePosY;
|
||||||
|
float m_fSourceWidth;
|
||||||
|
float m_fSourceHeight;
|
||||||
EString m_sFileName;
|
EString m_sFileName;
|
||||||
EString m_sResourceName;
|
EString m_sResourceName;
|
||||||
EString m_sResourceType;
|
EString m_sResourceType;
|
||||||
ID2D1Bitmap * pBitmap;
|
ID2D1Bitmap * m_pBitmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue