From 1364a0a17471df0cb5009d319b6bbaf7532b2e41 Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Sun, 1 Oct 2017 14:39:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9B=BE=E7=89=87=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=9C=BA=E5=88=B6=E9=98=B2=E6=AD=A2=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=90=8C=E4=B8=80=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Easy2D/Easy2D.vcxproj | 12 +++++ Easy2D/Object/Image.cpp | 108 ++++++++++++++++++++++++--------------- Easy2D/Object/Sprite.cpp | 8 +-- Easy2D/easy2d.h | 2 +- 4 files changed, 83 insertions(+), 47 deletions(-) diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj index 97709635..3331284e 100644 --- a/Easy2D/Easy2D.vcxproj +++ b/Easy2D/Easy2D.vcxproj @@ -179,6 +179,8 @@ Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None + false Console @@ -199,6 +201,8 @@ Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None + false Console @@ -221,6 +225,8 @@ Disabled _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None + false Console @@ -238,6 +244,8 @@ Disabled _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None + false Console @@ -257,6 +265,7 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None Console @@ -278,6 +287,7 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None Console @@ -301,6 +311,7 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None Console @@ -322,6 +333,7 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + None Console diff --git a/Easy2D/Object/Image.cpp b/Easy2D/Object/Image.cpp index 615f67a2..a9495b24 100644 --- a/Easy2D/Object/Image.cpp +++ b/Easy2D/Object/Image.cpp @@ -1,10 +1,18 @@ #include "..\easy2d.h" #include "..\EasyX\easyx.h" +#include +using namespace std; +// 图片缓存 +static map s_mCImages; +// 从图片缓存中读取图片 +static CImage* GetCImage(tstring name, bool fromRes = false); // 对 PNG 图像进行像素转换 static void CrossImage(CImage &img); + Image::Image() : + m_pCImage(nullptr), m_nAlpha(255), m_fScaleX(1), m_fScaleY(1) @@ -30,18 +38,18 @@ Image::~Image() void Image::_onDraw() { // display 属性为 false,或未设置图片资源时,不绘制该图片 - if (!m_bDisplay || m_Image.IsNull()) + if (!m_bDisplay || !m_pCImage) { return; } // 绘制图片 - if (m_Image.GetBPP() == 32) + if (m_pCImage->GetBPP() == 32) { - m_Image.AlphaBlend(GetImageHDC(), m_Rect, m_SrcRect, m_nAlpha, AC_SRC_OVER); + m_pCImage->AlphaBlend(GetImageHDC(), m_Rect, m_SrcRect, m_nAlpha, AC_SRC_OVER); } else { - m_Image.Draw(GetImageHDC(), m_Rect, m_SrcRect); + m_pCImage->Draw(GetImageHDC(), m_Rect, m_SrcRect); } } @@ -62,32 +70,13 @@ float Image::getOpacity() const bool Image::setImage(LPCTSTR ImageFile) { - //判断图片路径是否存在 - if (!PathFileExists(ImageFile)) + m_pCImage = GetCImage(ImageFile); + if (m_pCImage) { - return false; + reset(); + return true; } - // 清空原资源 - if (!m_Image.IsNull()) - { - m_Image.Destroy(); - } - // 加载图片 - m_Image.Load(ImageFile); - // 加载失败 - if (m_Image.IsNull()) - { - return false; - } - // 确认该图像包含 Alpha 通道 - if (m_Image.GetBPP() == 32) - { - // 透明图片处理 - CrossImage(m_Image); - } - reset(); - - return true; + return false; } bool Image::setImage(LPCTSTR ImageFile, int x, int y, int width, int height) @@ -104,16 +93,13 @@ bool Image::setImage(LPCTSTR ImageFile, int x, int y, int width, int height) bool Image::setImageFromRes(LPCTSTR pResName) { - // 从资源加载图片(不支持 PNG) - m_Image.LoadFromResource(GetModuleHandle(NULL), pResName); - // 加载失败 - if (m_Image.IsNull()) + m_pCImage = GetCImage(pResName, true); + if (m_pCImage) { - return false; + reset(); + return true; } - reset(); - - return true; + return false; } bool Image::setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height) @@ -130,8 +116,8 @@ bool Image::setImageFromRes(LPCTSTR pResName, int x, int y, int width, int heigh void Image::crop(int x, int y, int width, int height) { - width = min(max(width, 0), m_Image.GetWidth()); - height = min(max(height, 0), m_Image.GetHeight()); + width = min(max(width, 0), m_pCImage->GetWidth()); + height = min(max(height, 0), m_pCImage->GetHeight()); // 设置源矩形的位置和大小(用于裁剪) m_SrcRect.SetRect(x, y, x + width, y + height); // 设置目标矩形(即绘制到窗口的位置和大小) @@ -156,7 +142,7 @@ void Image::setScale(float scaleX, float scaleY) void Image::setOpacity(float value) { - if (m_Image.GetBPP() == 32) + if (m_pCImage->GetBPP() == 32) { m_nAlpha = BYTE(min(max(value, 0), 1) * 255); } @@ -165,15 +151,15 @@ void Image::setOpacity(float value) void Image::setTransparentColor(COLORREF value) { // 设置透明色 - m_Image.SetTransparentColor(value); + m_pCImage->SetTransparentColor(value); } void Image::reset() { // 设置目标矩形(即绘制到窗口的位置和大小) - setSize(m_Image.GetWidth(), m_Image.GetHeight()); + setSize(m_pCImage->GetWidth(), m_pCImage->GetHeight()); // 设置源矩形(即截取图片的大小) - m_SrcRect.SetRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()); + m_SrcRect.SetRect(0, 0, m_pCImage->GetWidth(), m_pCImage->GetHeight()); // 重置缩放属性 m_fScaleX = 1; m_fScaleY = 1; @@ -209,4 +195,42 @@ void CrossImage(CImage &img) cr[2] = cr[2] * cr[3] / 255; } } +} + +CImage* GetCImage(tstring name, bool fromRes) +{ + if (s_mCImages.find(name) == s_mCImages.end()) + { + CImage cImage; + // 加载图片 + if (fromRes) + { + // 从资源加载图片(不支持 PNG) + cImage.LoadFromResource(GetModuleHandle(NULL), name.c_str()); + } + else + { + //判断图片路径是否存在 + if (!PathFileExists(name.c_str())) + { + return nullptr; + } + cImage.Load(name.c_str()); + } + // 加载失败 + if (cImage.IsNull()) + { + return nullptr; + } + // 确认该图像包含 Alpha 通道 + if (cImage.GetBPP() == 32) + { + // 透明图片处理 + CrossImage(cImage); + } + } + else + { + return &s_mCImages.at(name); + } } \ No newline at end of file diff --git a/Easy2D/Object/Sprite.cpp b/Easy2D/Object/Sprite.cpp index bb86aac5..35d100e5 100644 --- a/Easy2D/Object/Sprite.cpp +++ b/Easy2D/Object/Sprite.cpp @@ -35,18 +35,18 @@ bool Sprite::_exec(bool active) void Sprite::_onDraw() { // display 属性为 false,或未设置图片资源时,不绘制该图片 - if (!m_bDisplay || m_pImage->m_Image.IsNull()) + if (!m_bDisplay || !m_pImage->m_pCImage) { return; } // 绘制图片 - if (m_pImage->m_Image.GetBPP() == 32) + if (m_pImage->m_pCImage->GetBPP() == 32) { - m_pImage->m_Image.AlphaBlend(GetImageHDC(), getRect(), m_pImage->m_SrcRect, m_nAlpha, AC_SRC_OVER); + m_pImage->m_pCImage->AlphaBlend(GetImageHDC(), getRect(), m_pImage->m_SrcRect, m_nAlpha, AC_SRC_OVER); } else { - m_pImage->m_Image.Draw(GetImageHDC(), getRect(), m_pImage->m_SrcRect); + m_pImage->m_pCImage->Draw(GetImageHDC(), getRect(), m_pImage->m_SrcRect); } } diff --git a/Easy2D/easy2d.h b/Easy2D/easy2d.h index 707848bc..0a0cb76e 100644 --- a/Easy2D/easy2d.h +++ b/Easy2D/easy2d.h @@ -695,7 +695,7 @@ public: static void saveScreenshot(); protected: - CImage m_Image; + CImage* m_pCImage; CRect m_SrcRect; BYTE m_nAlpha; float m_fScaleX;