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

📄 ppgameview.cpp

📁 一个点泡泡游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// PPGameView.cpp: implementation of the CPPDemoView class.
//
//////////////////////////////////////////////////////////////////////

#include "PPGameView.h"
#include "PPKeyControl.h"

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

CPPGameView::CPPGameView()
{

}

CPPGameView::CPPGameView(CPPGameDoc* pDoc)
{
	SetDocument(pDoc);
}

CPPGameView::~CPPGameView()
{

}

void CPPGameView::OnStartView()
{
	// 初始化对象
	if (!OnInitData())
	{
		Release();
		return;
	}

	m_pDoc->SetCurView(this);

	// 将定时器与回调函数关联
	CALLBACK_Init(&m_cbTimer, (PFNNOTIFY)HandleTimer, this);

	OnSetTimer();
}

bool CPPGameView::OnInitData()
{
	int i = 0;
	int j = 0;

//	m_pISoundPlayer1 = NULL;
//	m_pISoundPlayer2 = NULL;
	m_pIMedia1 = NULL;
	m_pIMedia2 = NULL;

	m_bMoveSelect = false;
	m_nCurCol = 0;

	m_nBrowIndex = 2;

	m_bPause = false;

	// 初始第一级别、剩余6行钻石过关(暂定3,测试)
	m_nlevel = m_pDoc->m_tGameScore.nLevel;
	m_nLines[0] = 15;
	m_nLines[1] = 15;
	m_pDoc->m_tGameScore.nLevel = 1;
	m_pDoc->m_tGameScore.nScore = 0;

	for (i = 0; i < DIAMOND_ROW; i++)
	{
		for (j =0; j < DIAMOND_COL; j++)
		{
			m_nDiamond[i][j][0] = 0;
			m_nDiamond[i][j][1] = -1;
			m_nDiamond[i][j][2] = 0;
		}
	}

	for (j = 0; j < DIAMOND_COL; j++)
	{
		m_nNewLine[j][0] = 0;
		m_nNewLine[j][1] = -1;
		m_nNewLine[j][2] = 0;
	}

	if (!m_pDoc->m_bGameView)// 初始化演示数据
	{
		int nTempDiamond[64] = {7, 4, 1, 4, 4, 3, 4, 1, 3, 
						 1, 1, 1, 3, 3, 3, 2, 1, 3,
						 3, 2, 3, 2, 3, 1, 3, 2, 2,
						 4, 1, 4, 2, 1, 1, 4, 1, 2,
						 // 从这里开始是增加行(数组第36的位子)
						 1, 2, 2, 3, 2, 4, 3, 4, 3,
						 4, 3, 2, 1, 1, 4, 4, 2, 1,
						 1, 1, 4, 2, 4, 2, 7, 3, 1, 3};

		MEMCPY(m_nDemoDiamondType, nTempDiamond, sizeof(int) * 64);

		EKEYCODE nTempKey[37] = {EKEY_LEFT, EKEY_LEFT, EKEY_LEFT, EKEY_LEFT, EKEY_LEFT,
								 EKEY_SELECT, EKEY_DOWN, EKEY_DOWN, EKEY_RIGHT, EKEY_RIGHT,
								 EKEY_RIGHT, EKEY_RIGHT, EKEY_RIGHT, EKEY_SELECT, EKEY_UP,
								 EKEY_RIGHT, EKEY_SELECT, EKEY_RIGHT, EKEY_SELECT, EKEY_DOWN,
								 EKEY_LEFT, EKEY_LEFT, EKEY_LEFT, EKEY_LEFT, EKEY_UP,
								 EKEY_UP, EKEY_LEFT, EKEY_SELECT, EKEY_DOWN, EKEY_DOWN,
								 EKEY_RIGHT, EKEY_RIGHT, EKEY_RIGHT, EKEY_SELECT, EKEY_LEFT,
								 EKEY_LEFT, EKEY_LEFT};

		int irr = sizeof(nTempKey);
		int ttt = sizeof(EKEYCODE);
		MEMCPY(m_nDemoKeyPress, nTempKey, sizeof(nTempKey));

	}

	// 初始化位图存储内存
	m_pScreen[0] = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	m_pScreen[1] = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	m_pScreen[2] = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	m_pScreen[3] = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
	IBITMAP_CreateCompatibleBitmap(m_pScreen[0], &m_pbmDbd[0], (uint16)128, (uint16)144);
	IBITMAP_CreateCompatibleBitmap(m_pScreen[1], &m_pbmDbd[1], (uint16)190, (uint16)10);
	IBITMAP_CreateCompatibleBitmap(m_pScreen[2], &m_pbmDbd[2], (uint16)88, (uint16)23);
	IBITMAP_CreateCompatibleBitmap(m_pScreen[3], &m_pbmDbd[3], (uint16)216, (uint16)12);

	BEGIN_CHECK
	{
		CHECK_NULL(m_pBitmap[IDB_GAMEBACK_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pBitmap[IDB_DIAMOND_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pBitmap[IDB_BROW_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pBitmap[IDB_SELECT_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pBitmap[IDB_BLAST_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pBitmap[IDB_DATA_INDEX], CPPBitmap::CreateInstance());

		// 游戏菜单
		CHECK_NULL(m_pGameMenuBitmap[IDB_GAMEMENUTEXT_INDEX], CPPBitmap::CreateInstance());
		CHECK_NULL(m_pGameMenuBitmap[IDB_GAMEMENUBACK_INDEX], CPPBitmap::CreateInstance());

		LoadGameMenuBmpRes();
	}
	CATCH_CHECK
	{
		CUSTOM_RELEASE(m_pBitmap[IDB_GAMEBACK_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_DIAMOND_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_BROW_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_SELECT_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_BLAST_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_DATA_INDEX]);

		// 游戏菜单
		CUSTOM_RELEASE(m_pGameMenuBitmap[IDB_GAMEMENUTEXT_INDEX]);
		CUSTOM_RELEASE(m_pGameMenuBitmap[IDB_GAMEMENUBACK_INDEX]);
	}
	END_CHECK

	// 将键盘按键全部清空
	m_pDoc->GetKeyControl()->InitData();

	// 加载位图资源
	if (LoadGameBmpRes())
	{
		// 先取原图存入内存
		IBITMAP_BltIn(m_pbmDbd[0], 0, 0, 128, 144, m_pBitmap[IDB_GAMEBACK_INDEX]->m_pIBitmap,
			0, 0, AEE_RO_COPY);
		IBITMAP_BltIn(m_pbmDbd[1], 0, 0, 190, 10, m_pBitmap[IDB_DIAMOND_INDEX]->m_pIBitmap,
			0, 0, AEE_RO_COPY);
		IBITMAP_BltIn(m_pbmDbd[2], 0, 0, 88, 23, m_pBitmap[IDB_BLAST_INDEX]->m_pIBitmap,
			0, 0, AEE_RO_COPY);
		IBITMAP_BltIn(m_pbmDbd[3], 0, 0, 216, 12, m_pBitmap[IDB_DATA_INDEX]->m_pIBitmap,
			0, 0, AEE_RO_COPY);

		// 图片存入缓冲区,清除资源
		CUSTOM_RELEASE(m_pBitmap[IDB_GAMEBACK_INDEX]);
		m_pBitmap[IDB_GAMEBACK_INDEX] = NULL;
		CUSTOM_RELEASE(m_pBitmap[IDB_DIAMOND_INDEX]);
		m_pBitmap[IDB_DIAMOND_INDEX] = NULL;
		CUSTOM_RELEASE(m_pBitmap[IDB_BLAST_INDEX]);
		m_pBitmap[IDB_BLAST_INDEX] = NULL;
		CUSTOM_RELEASE(m_pBitmap[IDB_DATA_INDEX]);
		m_pBitmap[IDB_DATA_INDEX] = NULL;
	}

	// 设置游戏菜单
	m_eCurMenu = EMENU_RETURN_GAME;// 初始化当前菜单为声音开

	// 获取图片大小
	int nReturn;
	AEEBitmapInfo bmpInfo;
	nReturn = m_pGameMenuBitmap[IDB_GAMEMENUTEXT_INDEX]->GetBMPInfo(bmpInfo);
	if (nReturn != SUCCESS)
		return false;

	// 每个菜单文字的宽度
	m_nMenuWidth = bmpInfo.cx / 8;
	m_nMenuHeight = bmpInfo.cy;

	// 初始化选择框坐标
	m_tSelectPoint.ptx = 6;
	m_tSelectPoint.pty = 5;
	m_tSelectPoint.ptOldScreenX = 52;
	m_tSelectPoint.ptOldScreenY = 75;
	m_tSelectPoint.ptNewScreenX = 52;
	m_tSelectPoint.ptNewScreenY = 75;

	m_nGameTimeCount = 0;	// 初始定时器计数为0

	m_nCurSelectIndex = 0;

    // 设置声音
//    if (ISHELL_CreateInstance(((CPPGameApp*) GETAPPINSTANCE())->m_pIShell, AEECLSID_SOUNDPLAYER, 
//        (void**)&m_pISoundPlayer1) != SUCCESS)
//    {
//        ISOUNDPLAYER_Release(m_pISoundPlayer1);
//        m_pISoundPlayer1 = NULL;
//    }
//    
//    if (ISHELL_CreateInstance(((CPPGameApp*) GETAPPINSTANCE())->m_pIShell, AEECLSID_SOUNDPLAYER, 
//        (void**)&m_pISoundPlayer2) != SUCCESS)
//    {
//        ISOUNDPLAYER_Release(m_pISoundPlayer2);
//        m_pISoundPlayer2 = NULL;
//    }
    if (ISHELL_CreateInstance(((CPPGameApp*) GETAPPINSTANCE())->m_pIShell, AEECLSID_MEDIAMIDI,
				(void**)&m_pIMedia1) != SUCCESS)
	{
		if (m_pIMedia1 == NULL)
		{
			IMEDIA_Release(m_pIMedia1);
			m_pIMedia1 = NULL;
		}
    }
	if (ISHELL_CreateInstance(((CPPGameApp*) GETAPPINSTANCE())->m_pIShell, AEECLSID_MEDIAMIDI,
		(void**)&m_pIMedia2) != SUCCESS)
	{
		if (m_pIMedia2 == NULL)
		{
			IMEDIA_Release(m_pIMedia2);
			m_pIMedia2 = NULL;
		}
    }

	AEEMediaData tMediaData;
	
    // 创建文件接口
    if (ISHELL_CreateInstance(((CPPGameApp*) GETAPPINSTANCE())->m_pIShell,
        AEECLSID_FILEMGR, (void**)&m_pIFileMgr) != SUCCESS)
    {
        IRELEASE(m_pIFileMgr, FILEMGR);
        return false;
    }
    
    // 打开声音文件
    m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, "mid/highscore.mid", _OFM_READ);
    if (m_pIFile == NULL)
    {
        IRELEASE(m_pIFileMgr, FILEMGR);
        return false;
    }

    FileInfo tFileInfo;
    IFILE_GetInfo(m_pIFile, &tFileInfo);
    m_pSoundBuffer1 = (char* )MALLOC(tFileInfo.dwSize);
    IFILE_Read(m_pIFile, m_pSoundBuffer1, tFileInfo.dwSize);
//	ISOUNDPLAYER_Set(m_pISoundPlayer1, SDT_BUFFER, (void* )m_pSoundBuffer1);
	tMediaData.clsData = MMD_BUFFER;
	tMediaData.dwSize = tFileInfo.dwSize;
	tMediaData.pData = m_pSoundBuffer1;
	IMEDIA_SetMediaData(m_pIMedia1, &tMediaData);
    if (m_pIFile)
    {
        IFILE_Release(m_pIFile);
        m_pIFile = NULL;
    }

    // 打开声音文件
    m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, "mid/gameover.mid", _OFM_READ);
    if (m_pIFile == NULL)
    {
        IRELEASE(m_pIFileMgr, FILEMGR);
        return false;
    }

    IFILE_GetInfo(m_pIFile, &tFileInfo);
    m_pSoundBuffer2 = (char* )MALLOC(tFileInfo.dwSize);
    IFILE_Read(m_pIFile, m_pSoundBuffer2, tFileInfo.dwSize);
//	ISOUNDPLAYER_Set(m_pISoundPlayer2, SDT_BUFFER, (void* )m_pSoundBuffer2);
	tMediaData.clsData = MMD_BUFFER;
	tMediaData.dwSize = tFileInfo.dwSize;
	tMediaData.pData = m_pSoundBuffer2;
	IMEDIA_SetMediaData(m_pIMedia2, &tMediaData);

	return true;
}

void CPPGameView::HandleTimer(void* pView)
{
	((CPPGameView* )pView)->OnTimer();
}

void CPPGameView::OnTimer()
{
	// 重新计算数据
	if (m_pDoc == NULL)
		return;

	// 在Doc里处理按键事件
	if (!m_pDoc->UpdateGameView())
		return;

	// 如果暂停,就不重画其他
	if (!m_bPause)
	{
		// 重绘
		if (m_pDoc->m_bGameView)
			OnDraw();
		else
			OnDrawDemo();
	}
	else // 画上游戏菜单
	{
		OnDraw();
		DrawGameMenu();
	}

	// 获取应用程序指针
	CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
	if (pApp == NULL)
	{
		return;
	}


	BEGIN_CHECK
	{
		// 取app指针
		CHECK_NULL(pApp, (CPPGameApp*) GETAPPINSTANCE());
		CHECK_ERROR(ISHELL_SetTimerEx(pApp->m_pIShell, TIME_GAME_VIEW, &m_cbTimer));
	}
	CATCH_CHECK
	{
		return;
	}
	END_CHECK
}

boolean CPPGameView::LoadGameBmpRes()
{
	BEGIN_CHECK
	{
		// 加载位图资源
		CHECK_ERROR(m_pBitmap[IDB_GAMEBACK_INDEX]->Load(IDB_GAMEBACK));
		CHECK_ERROR(m_pBitmap[IDB_DIAMOND_INDEX]->Load(IDB_DIAMOND));
		CHECK_ERROR(m_pBitmap[IDB_BROW_INDEX]->Load(IDB_BROW));
		CHECK_ERROR(m_pBitmap[IDB_SELECT_INDEX]->Load(IDB_SELECT));
		CHECK_ERROR(m_pBitmap[IDB_BLAST_INDEX]->Load(IDB_BLAST));
		CHECK_ERROR(m_pBitmap[IDB_DATA_INDEX]->Load(IDB_DATA));
	}
	CATCH_CHECK
	{
		CUSTOM_RELEASE(m_pBitmap[IDB_GAMEBACK_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_DIAMOND_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_BROW_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_SELECT_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_BLAST_INDEX]);
		CUSTOM_RELEASE(m_pBitmap[IDB_DATA_INDEX]);
		return false;
	}

	return true;
}

void CPPGameView::OnSetTimer()
{
	AECHAR str[5];
	MEMSET(str, 0, 5);

	// 画图背景
	IBITMAP_BltIn(m_pScreen[0], 0, 0, SCREEN_PROPERTY_WIDTH, SCREEN_PROPERTY_HIGTH, m_pbmDbd[0], 0, 0, AEE_RO_COPY);

	// 画钻石
	if (m_pDoc->m_bGameView)
		InitDiamondData();
	else
		InitDemoData();

	// 画表情
	m_pBitmap[IDB_BROW_INDEX]->Draw(100, 95, 25, 24, 25 * m_nBrowIndex, 0);

	// 画选择框
	m_pBitmap[IDB_SELECT_INDEX]->Draw(42, 75, 14, 14, 14 * m_nCurSelectIndex , 0);

	// 画得分的数据
	int nIndex = m_pDoc->GetDataIndex(0);
	Draw(m_pScreen[3], m_pbmDbd[3], 118, 125, 6, 12, nIndex, 0);

	// 画剩余行数的数据
	int nLine = m_nLines[1];
	int nCount = 0;
	while (true)
	{
		int nTempData = nLine % 10;
		nIndex = m_pDoc->GetDataIndex(nTempData);

		Draw(m_pScreen[3], m_pbmDbd[3], 115 - nCount * 6 , 72, 6, 12, nIndex, 0);
		
		nLine = nLine / 10;
		nCount++;

		if (nLine == 0)
			break;
	}

	// 画级别
	nIndex = m_pDoc->GetDataIndex(1);
	Draw(m_pScreen[3], m_pbmDbd[3], 118, 39, 6, 12, nIndex, 0);
	
	// 设置定时器
	SetTimer(TIME_GAME_VIEW, (PFNNOTIFY)(CPPGameView::HandleTimer));
}
void CPPGameView::RegisterSound(bool bPlay)
{
	CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
	if (pApp == NULL)
		return;
	
//	if (bPlay)
//	{
//		if (pApp->m_tOpenSound.bOpenSound)
//		{
//			ISOUNDPLAYER_RegisterNotify(m_pISoundPlayer1, (PFNSOUNDPLAYERSTATUS)Play, this);
//		}
//	}
//	else
//		ISOUNDPLAYER_RegisterNotify(m_pISoundPlayer1, NULL, NULL);
}

void CPPGameView::PlaySound(ESOUNTTYPE eSoundStatus)
{
    if (((CPPGameApp*) GETAPPINSTANCE())->m_tOpenSound.bOpenSound)
    {
        switch(eSoundStatus)
        {
        case NORMAL_BLAST:
//			ISOUNDPLAYER_Play(m_pISoundPlayer1);
			IMEDIA_Play(m_pIMedia1);
            break;
        case BOMB_BLAST:
//			ISOUNDPLAYER_Play(m_pISoundPlayer2);
			IMEDIA_Play(m_pIMedia2);
            break;
	    case NEXT_LEVEL:
		    break;
	    case OTHER_STATUS:
		    break;
	    default:
		    break;
        }
	}
}

void CPPGameView::StopSound()
{
//	ISOUNDPLAYER_Stop(m_pISoundPlayer1);
	RegisterSound(false);
}

void CPPGameView::SetVolume(int nVolume)
{
//	ISOUNDPLAYER_SetVolume(m_pISoundPlayer1, nVolume);
}

void CPPGameView::SetSoundStatus(ESOUNTTYPE eSoundStatus)
{
    m_eSoundStatus = eSoundStatus;
}

ESOUNTTYPE CPPGameView::GetSoundStatus()
{
    return m_eSoundStatus;
}

void CPPGameView::OnDraw()
{
	int nRow = 0;
	int nCol = 0;

	// 重画背景图
	IBITMAP_BltIn(m_pScreen[0], 0, 0, SCREEN_PROPERTY_WIDTH, SCREEN_PROPERTY_HIGTH, m_pbmDbd[0], 0, 0, AEE_RO_COPY);

	// 重绘钻石、选择框
	for (nRow = 0; nRow < DIAMOND_ROW; nRow++)
	{
		for (nCol = 0; nCol < DIAMOND_COL; nCol++)
		{
			int nPosX = GetXPosFromColDiamond(nCol);
			int nPosY = GetYPosFromRowDiamond(nRow);

			if (m_nDiamond[nRow][nCol][0] != 0)
			{
				switch (m_nDiamond[nRow][nCol][0])
				{
				case 1:
				case 2:
				case 3:
				case 4:
					Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
						nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
					break;
				case 5:	// 红炸弹
					{
						Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);

						if (m_nDiamond[nRow][nCol][1] == 6)
							m_nDiamond[nRow][nCol][1] = 4;
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				case 6: // 黄炸弹
					{
						Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
						
						if (m_nDiamond[nRow][nCol][1] == 9)
							m_nDiamond[nRow][nCol][1] = 7;
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				case 7: // 蓝炸弹
					{
						Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
						
						if (m_nDiamond[nRow][nCol][1] == 12)
							m_nDiamond[nRow][nCol][1] = 10;
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				case 8: // 粉炸弹
					{
						Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
						
						if (m_nDiamond[nRow][nCol][1] == 15)
							m_nDiamond[nRow][nCol][1] = 13;
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				case 9: // 黑炸弹
					{
						Draw(m_pScreen[1], m_pbmDbd[1], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
						
						if (m_nDiamond[nRow][nCol][1] == 18)
							m_nDiamond[nRow][nCol][1] = 16;
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				case 10: // 爆炸
					{
						Draw(m_pScreen[2], m_pbmDbd[2], nPosX,
							nPosY, 10, 10, m_nDiamond[nRow][nCol][1] * 10, 0);
						
						if (m_nDiamond[nRow][nCol][1] == 3)
						{
							m_nDiamond[nRow][nCol][0] = 0;
							m_nDiamond[nRow][nCol][1] = 0;
						}
						else
							m_nDiamond[nRow][nCol][1]++;
					}
					break;
				default:
					break;
				}
			}
		}
	}

	// 处理选择框索引
	if (m_nGameTimeCount % 2 == 0)
	{
		if (m_nGameTimeCount == 0)
			m_nCurSelectIndex = m_nCurSelectIndex;
		else
			m_nCurSelectIndex = (m_nCurSelectIndex == 0) ? 1 : 0;
	}

⌨️ 快捷键说明

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