⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppbitmap.cpp

📁 一个点泡泡游戏
💻 CPP
字号:
// PPBitmap.cpp: implementation of the CPPBitmap class.
//
//////////////////////////////////////////////////////////////////////

#include "PPBitmap.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPPBitmap::CPPBitmap()
{
	m_pIBitmap = NULL;
}

CPPBitmap::CPPBitmap(IBitmap* pIBitmap)
{
	m_pIBitmap = pIBitmap;
}

CPPBitmap::~CPPBitmap()
{
}

CPPBitmap* CPPBitmap::CreateInstance()
{
	CPPBitmap* pObj = new CPPBitmap();
	
	// 如果实例创建成功,调用初始化函数
	//	if (pObj)
	//	{
	//		if (!pObj->InitData())
	//		{
	//			pObj->Release();
	//			pObj = NULL;
	//		}
	//	}
	
	// 返回实例指针
	return pObj;
}

boolean CPPBitmap::Load(int nResID)
{
	// 首先释放原有资源
//	FreeData();
	
	// 载入图片
	CPPGameApp* pApp  = NULL;
	IShell* pIShell = NULL;

	BEGIN_CHECK
	{
		CHECK_NULL(pApp, (CPPGameApp*)GETAPPINSTANCE());
		CHECK_NULL(pIShell, pApp->m_pIShell);

		CHECK_NULL(m_pIBitmap, ISHELL_LoadResBitmap(pIShell, PP_RES_FILE, nResID));
	}
	CATCH_CHECK
	{
		CUSTOM_RELEASE(pApp);
		ISHELL_Release(pIShell);
		IBITMAP_Release(m_pIBitmap);
		return EFAILED;
	}
	END_CHECK

	return SUCCESS;
}

void CPPBitmap::FreeData()
{
	if (m_pIBitmap)
		IBITMAP_Release(m_pIBitmap);
}

int CPPBitmap::Draw(int nDrawX, int nDrawY, int nDrawAlign, AEERasterOp rop /* = AEE_RO_TRANSPARENT */)
{
	int nReturn;

	// 获取图片大小
	AEEBitmapInfo bmpInfo;
	nReturn = GetBMPInfo(bmpInfo);
	if (nReturn != SUCCESS)
		return nReturn;

	// 获取显示的设备
	IBitmap* pScreen;
	nReturn = IDISPLAY_GetDeviceBitmap(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay, &pScreen);
	if (nReturn != SUCCESS)
	{
		IRELEASE(pScreen, BITMAP);
		return nReturn;
	}

	CPPBitmap bmpDisplay(pScreen);

	// 绘图
	BltIn(bmpDisplay.m_pIBitmap, nDrawX, nDrawY, bmpInfo.cx, bmpInfo.cy, 0, 0, rop);

	IDISPLAY_Update(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);

	IRELEASE(pScreen, BITMAP);
	
    return SUCCESS;
}

int CPPBitmap::Draw(boolean bSheer, int nDrawX, int nDrawY, int nSrcX, int nSrcY, AEERasterOp rop)
{
	IBitmap* pbmScreen = NULL;
	IBitmap* pbmDdb = NULL;
	NativeColor    color;
	AEEBitmapInfo  bi;
	
	pbmScreen = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	
	IBITMAP_GetInfo(m_pIBitmap, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, bi.cx, bi.cy, m_pIBitmap, nSrcX, nSrcY, AEE_RO_COPY);
	
	if (bSheer)
	{
		IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
		IBITMAP_SetTransparencyColor(pbmDdb,color);
	}
	
	IBITMAP_BltIn(pbmScreen, nDrawX, nDrawY, bi.cx, bi.cy, pbmDdb, 0, 0, AEE_RO_TRANSPARENT);
	IDISPLAY_Update (((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	IBITMAP_Release(pbmDdb);
	IBITMAP_Release(pbmScreen);

	return SUCCESS;
}

int CPPBitmap::GetBMPInfo(AEEBitmapInfo& bmpInfo)
{
    if (m_pIBitmap == NULL)
    {
        return EBADCLASS;
    }
	
    return IBITMAP_GetInfo(m_pIBitmap, &bmpInfo, sizeof(bmpInfo));
}

int CPPBitmap::GetTopLeftCoord(AEEPoint& ptTopLeft, int nDrawX, int nDrawY, int nDrawAlign)
{
    // 获取计算需要使用的图片大小
    AEEBitmapInfo bmpInfo;
    int nReturn = GetBMPInfo(bmpInfo);
    if (nReturn != SUCCESS)
    {
        return nReturn;
    }
	
    // 计算横坐标
    switch (nDrawAlign & EDD_ALIGNHORZ_MASK)
    {
		// 右对齐时,图片左上角坐标等于图片显示坐标减去图片宽度
    case EDD_ALIGN_RIGHT:
        ptTopLeft.x = nDrawX - (int)bmpInfo.cx;
        break;
		// 居中对齐时,图片左上角坐标等于图片显示坐标减去图片宽度一半
    case EDD_ALIGN_CENTER:
        ptTopLeft.x = nDrawX - (int)bmpInfo.cx / 2;
        break;
		// 缺省情况下使用左对齐
    case EDD_ALIGN_LEFT:
    default:
        ptTopLeft.x = nDrawX;
        break;
    }
	
    // 计算纵坐标
    switch (nDrawAlign & EDD_ALIGNVERT_MASK)
    {
		// 底部对齐时,图片左上角坐标等于图片显示坐标减去图片宽度
    case EDD_ALIGN_BOTTOM:
        ptTopLeft.y = nDrawY - (int)bmpInfo.cy;
        break;
		// 居中对齐时,图片左上角坐标等于图片显示坐标减去图片宽度一半
    case EDD_ALIGN_MIDDLE:
        ptTopLeft.y = nDrawY - (int)bmpInfo.cy / 2;
        break;
		// 缺省情况下使用顶部对齐
    case EDD_ALIGN_TOP:
    default:
        ptTopLeft.y = nDrawX;
        break;
    }
    
    return SUCCESS;
}

int CPPBitmap::BltIn(IBitmap* pDest, int xDest, int yDest, int dx, int dy, 
                      int xSrc, int ySrc, AEERasterOp rop)
{
    if (m_pIBitmap == NULL)
    {
        return EBADCLASS;
    }
	
    return IBITMAP_BltIn(pDest, xDest, yDest, dx, dy, m_pIBitmap, xSrc, ySrc, rop);
}

void CPPBitmap::Release()
{
	FreeData();
	if (this)
		delete this;
}

int CPPBitmap::Draw(int nDrawX, int nDrawY, int dx, int dy, int xSrc, int ySrc, AEERasterOp rop)
{
	IBitmap* pbmScreen = NULL;
	IBitmap* pbmDdb = NULL;
	NativeColor    color;
	AEEBitmapInfo  bi;

	pbmScreen = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);

	IBITMAP_GetInfo(m_pIBitmap, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, dx, dy, m_pIBitmap, xSrc, ySrc, AEE_RO_COPY);
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb,color);
	IBITMAP_BltIn(pbmScreen, nDrawX, nDrawY, dx, dy, pbmDdb, 0, 0, AEE_RO_TRANSPARENT);
	IDISPLAY_Update (((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	IBITMAP_Release(pbmDdb);
	IBITMAP_Release(pbmScreen);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -