📄 ppgameview.cpp
字号:
// 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 + -