📄 game.cpp
字号:
wcscpy(tcWaveFile,tcAppExePath);
wcscat(tcWaveFile,TEXT("Q11\\open.wav"));
PlaySound (tcWaveFile,NULL,SND_FILENAME|SND_ASYNC);
HDC hDC = GetDC(hWnd);
RECT rc;
GetClientRect(hWnd,&rc);
int a,b;
#if _WIN32_WCE
a = 101;
b = 4;
#else
a = 50;
b = 10;
#endif
for (int m=0;m<a;m++)
{
BitBlt(hDC,0,0,rc.left,ScreenH,g_hBufDC,0,0,BLACKNESS);
//BitBlt(hDC,rc.right,0,(ScreenW - rc.right),ScreenH,
// g_hBufDC,0,0,BLACKNESS);
rc.left += b;
rc.right -= b;
Sleep(1);
}
//用于绘制“请稍候……”
rc.left = 0;
rc.top = ScreenH / 2;
rc.right = ScreenW;
rc.bottom = ScreenH;
SetTextColor(hDC,0x0000ffff); //黄色
SetBkMode(hDC,TRANSPARENT); //设置透明背景
if(m_iLevel > 1)
{
TCHAR str[256] = {'\0'};
swprintf(str,TEXT("祝贺通过第%d关!"),m_iLevel-1);
DrawText(hDC,str,-1,&rc,DT_CENTER);
rc.top += 20;
rc.bottom += 20;
}
DrawText(hDC,TEXT("请稍侯……"),-1,&rc,DT_CENTER);
ReleaseDC(hWnd,hDC);
hDC = NULL;
Sleep(1000);
}
//------------------------------------------------------------------------------
//过关
void CGame::PassLevel()
{
//!!!!!!!调试语句!!!!!!!!!!!
//m_iLevel = 2;
//!!!!!!!用完屏蔽!!!!!!!!!!!
HDC hDC = GetDC(hWnd);
if(m_iLevel > 5)
{
//游戏结束,打了通关=3
m_iGameStatus = 3;
m_bResetGame = TRUE;
return;
}
HBITMAP hBitMap = NULL;
TCHAR tcTempFile[MAX_PATH]={'\0'};
movespeed ++;
m_iFoeBossBlood = PassBlood*m_iLevel;
m_iFoeDead = 0;
//BOSS和BOSS子弹贴图部分未完成
switch(m_iLevel)
{
case 0:
break;
case 1:
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\map1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hMapDC,hBitMap);
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossDC,hBitMap);
LClose();
break;
case 2:
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\map2.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hMapDC,hBitMap);
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\boss2.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossDC,hBitMap);
VClose();
break;
case 3:
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\map3.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hMapDC,hBitMap);
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossDC,hBitMap);
LClose();
break;
case 4:
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\map4.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hMapDC,hBitMap);
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossDC,hBitMap);
VClose();
break;
case 5:
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\map5.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hMapDC,hBitMap);
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossDC,hBitMap);
LClose();
break;
}
wcscpy(tcTempFile,tcAppExePath);
wcscat(tcTempFile,TEXT("Q11\\bossbal1.bmp"));
hBitMap = SHLoadDIBitmap(tcTempFile);
SelectObject(g_hFoeBossBalDC,hBitMap);
m_bMoveBossRight = TRUE;
}
//------------------------------------------------------------------------------
//画敌机BOSS
void CGame::DrawFoeBoss()
{
if( m_iFoeDead <= (PassFoe * m_iLevel) )
return;
m_bSeeBoss = TRUE;
if(m_iFoeBossBlood <= 0)
{
m_bSeeBoss = FALSE;
m_iLevel ++;
PassLevel();
return;
}
RECT rect;
switch(m_iLevel)
{
case 1: //第一关
GetRect(&rect,m_pFoeBossPos.x,m_pFoeBossPos.y,100,120);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,g_hFoeBossDC,0,0,SRCINVERT);
if(m_pFoeBossPos.x <= 0)
m_bMoveBossRight = TRUE;
else if(m_pFoeBossPos.x >= ScreenW)
m_bMoveBossRight = FALSE;
if(TRUE == m_bMoveBossRight)
m_pFoeBossPos.x += m_iFoeBossSpeed + (movespeed);
else
m_pFoeBossPos.x -= m_iFoeBossSpeed + (movespeed);
break;
case 2:
case 3:
case 4:
case 5:
GetRect(&rect,m_pFoeBossPos.x,m_pFoeBossPos.y,109,73);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,g_hFoeBossDC,0,0,SRCINVERT);
if(m_pFoeBossPos.x <= 0)
m_bMoveBossRight = TRUE;
else if(m_pFoeBossPos.x >= ScreenW)
m_bMoveBossRight = FALSE;
if(TRUE == m_bMoveBossRight)
m_pFoeBossPos.x += m_iFoeBossSpeed + (movespeed);
else
m_pFoeBossPos.x -= m_iFoeBossSpeed + (movespeed);
break;
} //end switch(m_iLevel) here
DrawFoeBossBal();
m_iFoeBossSpeed = (int)(4*((long)rand()/32767.0))+1;
m_iFoeBossType=(int)(2*((long)rand()/32767.0));//0,1
}
//------------------------------------------------------------------------------
//画BOSS子弹
void CGame::DrawFoeBossBal()
{
RECT rect;
int i;
switch(m_iLevel)
{
case 1:
case 2:
case 3:
case 4:
case 5:
//子弹消失了,重发
if(TRUE == m_bBossBalClr)
{
m_bBossBalClr = FALSE;
for(i=0;i<m_iBossTotalBalNum;i++)
{
m_pFoeBossBalPos[i].x = m_pFoeBossPos.x + 50;
m_pFoeBossBalPos[i].y = m_pFoeBossPos.y + 120;
}
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOSSBALL),g_hInst,SND_RESOURCE|SND_ASYNC); //子弹声效
}
else
{
for(i=0;i<m_iBossTotalBalNum;i++)
{
if (m_iBossBalClr >= m_iBossTotalBalNum)
{
m_bBossBalClr = TRUE;
m_iBossBalClr = 0;
}
m_iFoeBossBalWay[i] = rand()%50-10; //-40~40
m_iFoeBossBalSpeed[i] = rand()%20; //0~20
GetRect(&rect, m_pFoeBossBalPos[i].x, m_pFoeBossBalPos[i].y, 25, 25);
BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,g_hFoeBossBalDC,0,0,SRCINVERT);
if(m_pFoeBossPos.x < ScreenW/2)
{
m_pFoeBossBalPos[i].x +=m_iFoeBossBalWay[i];
m_pFoeBossBalPos[i].y +=m_iFoeBossBalSpeed[i]+movespeed;
}
else if(m_pFoeBossPos.x > ScreenW/2)
{
m_pFoeBossBalPos[i].x -= m_iFoeBossBalWay[i];
m_pFoeBossBalPos[i].y += m_iFoeBossBalSpeed[i]+movespeed;
}
if( m_pFoeBossBalPos[i].x>ScreenW+100 ||
m_pFoeBossBalPos[i].x<-100 ||
m_pFoeBossBalPos[i].y>ScreenH+120 ||
m_pFoeBossBalPos[i].y<-120 )
{
m_iBossBalClr++;
}
}
}
break;
}
//m_iFoeBossBalType = (int)(2*((long)rand()/32767.0));//0,1
//m_iFoeBossBalWay[i] = (int)(3*((long)rand()/32767.0))-1;//-1,0,1
}
//------------------------------------------------------------------------------
//画背景文字
void CGame::DrawScore()
{
TCHAR str[256] = {'\0'};
RECT rc;
//开始
if(0 == m_iGameStatus)
{
HDC hDC = GetDC(hWnd);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, 0x0000ffff);
int iHigh;
#if _WIN32_WCE
rc.left = ScreenW / 6;
iHigh = 12;
#else
rc.left = ScreenW / 4;
iHigh = 20;
#endif
rc.right = ScreenW;
rc.top = ScreenH / 8;
rc.bottom = ScreenH;
DrawText(hDC,TEXT("【PC 缺省操作方式】"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("开 始: Enter"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("移 动: Up, Down, Left, Right或鼠标"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("子 弹: 自动或设置"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("炸 弹: Space"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("调 速: +, -"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("返 回: Escape"),-1,&rc,DT_LEFT);
rc.top += 2*iHigh;
rc.bottom += 2*iHigh;
DrawText(hDC,TEXT("【PPC (WINCE) 操作方式】"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("开 始: 单击触摸屏"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("移 动: 触摸笔上、下、左、右"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("子 弹: 自动"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("炸 弹: 双击触摸屏"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("调 速: 不能调di"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("返 回: “退出”菜单"),-1,&rc,DT_LEFT);
rc.top += 2*iHigh;
rc.bottom += 2*iHigh;
DrawText(hDC,TEXT("作者:oshj 2003.12 西安"),-1,&rc,DT_LEFT);
rc.top += iHigh;
rc.bottom += iHigh;
DrawText(hDC,TEXT("Email:oshj@21cn.com"),-1,&rc,DT_LEFT);
rc.top += 2*iHigh;
rc.bottom += 2*iHigh;
SetTextColor(hDC, RGB(255,0,0));
#if _WIN32_WCE
DrawText(hDC,TEXT("点击触摸屏开始"),-1,&rc,DT_LEFT);
#else
DrawText(hDC,TEXT("按回车或单击鼠标左键开始"),-1,&rc,DT_LEFT);
#endif
ReleaseDC(hWnd,hDC);
hDC = NULL;
}
//游戏中
if(1 == m_iGameStatus)
{
SetBkMode(g_hBufDC, TRANSPARENT);
SetTextColor(g_hBufDC, RGB(255,0,0));
rc.right = ScreenW - 10;
rc.left = rc.right - 200;
#if _WIN32_WCE
rc.bottom = ScreenH-26;
#else
rc.bottom = ScreenH-46;
#endif
rc.top = rc.bottom - 20;
swprintf(str,TEXT("我机损失总数:%d"),m_iTotalPlane);
DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
rc.top -= 20;
rc.bottom -= 20;
swprintf(str,TEXT("击落敌机总数:%d"),m_iFoeTotalDead);
DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
rc.left = 0;
rc.right = 100;
rc.top += 20;
rc.bottom += 20;
swprintf(str,TEXT("我机剩余:%d"),m_iReMain);
DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
rc.top -= 20;
rc.bottom -= 20;
swprintf(str,TEXT("我机炸弹:%d"),m_iBomb);
DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
if(TRUE == m_bSeeBoss)
{
rc.left = 10;
rc.top = 36;
rc.right = 100;
rc.bottom += 20;
swprintf(str,TEXT("BOSS血:%d"),m_iFoeBossBlood);
DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
}
rc.right = ScreenW - 10;
rc.left = rc.right - 100;
rc.top = 36;
rc.bottom = rc.top + 20;
swprintf(str,TEXT("当前速度:%d"),movespeed);
DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
rc.top += 20;
rc.bottom += 20;
swprintf(str,TEXT("当前关卡:%d"),m_iLevel);
DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
}
//结束
if(2 == m_iGameStatus)
{
HDC hDC = GetDC(hWnd);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, 0x0000ffff);
rc.left = ScreenW / 4;
rc.right = ScreenW;
rc.top = ScreenH / 4;
rc.bottom = ScreenH;
DrawText(hDC,TEXT("GAME OVER!"),-1,&rc,DT_LEFT);
rc.top += 20;
rc.bottom += 20;
if(m_iLevel >= 5)
{
DrawText(hDC,TEXT("厉害呀,打了个通关^_^"),-1,&rc,DT_LEFT);
}
else
{
rc.top += 20;
rc.bottom += 20;
DrawText(hDC,TEXT("很遗憾,你被电脑打败了"),-1,&rc,DT_LEFT);
rc.top += 20;
rc.bottom += 20;
swprintf(str,TEXT("你总共闯过:%d 关"),m_iLevel-1);
DrawText(hDC,str,-1,&rc,DT_LEFT);
}
rc.top += 20;
rc.bottom += 20;
swprintf(str,TEXT("总共击落敌机:%d 架"),m_iFoeTotalDead);
DrawText(hDC,str,-1,&rc,DT_LEFT);
rc.top += 20;
rc.bottom += 20;
swprintf(str,TEXT("我机损失总数:%d 架"),m_iTotalPlane);
DrawText(hDC,str,-1,&rc,DT_LEFT);
rc.top += 40;
rc.bottom += 40;
SetTextColor(hDC, RGB(255,0,0));
#if _WIN32_WCE
DrawText(hDC,TEXT("点击触摸屏继续"),-1,&rc,DT_LEFT);
rc.top += 20;
rc.bottom += 20;
DrawText(hDC,TEXT("点“退出”菜单返回"),-1,&rc,DT_LEFT);
#else
DrawText(hDC,TEXT("按回车或单击鼠标左键继续"),-1,&rc,DT_LEFT);
rc.top += 20;
rc.bottom += 20;
DrawText(hDC,TEXT("按 Escape 键返回"),-1,&rc,DT_LEFT);
#endif
ReleaseDC(hWnd,hDC);
hDC = NULL;
}
}
//------------------------------------------------------------------------------
//从配置文件中加载
void CGame::LoadFromIni()
{
CGameSet *gameset = new struct CGameSet;
ZeroMemory(gameset,sizeof(CGameSet));
DWORD dwRd;
HANDLE hf = CreateFile(iniFile, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,
OPEN_ALWAYS, 0, NULL);
if (hf == INVALID_HANDLE_VALUE) return;
SetFilePointer(hf, 0, NULL, FILE_BEGIN);
ReadFile(hf, gameset, sizeof(CGameSet), &dwRd, NULL);
if( 0==wcscmp(gameset->UserCur,TEXT("oshj")) ||
0==wcscmp(gameset->UserCur,TEXT("OSHJ")) )
{
m_iniSuperUser = TRUE; //超级用户,打不死哈哈
}
else
m_iniSuperUser = FALSE;
m_iniLevel = gameset->iLevelIndex;
LoadAscii(m_iniUp,gameset->Key[0]);
if( -1 == m_iniUp )
wcscpy(&m_iniUp,gameset->Key[0]);
LoadAscii(m_iniDown,gameset->Key[1]);
if( -1 == m_iniDown )
wcscpy(&m_iniDown,gameset->Key[1]);
LoadAscii(m_iniLeft,gameset->Key[2]);
if( -1 == m_iniLeft )
wcscpy(&m_iniLeft,gameset->Key[2]);
LoadAscii(m_iniRight,gameset->Key[3]);
if( -1 == m_iniRight )
wcscpy(&m_iniRight,gameset->Key[3]);
LoadAscii(m_iniFire,gameset->Key[4]);
if( -1 == m_iniFire )
wcscpy(&m_iniFire,gameset->Key[4]);
LoadAscii(m_iniThunder,gameset->Key[5]);
if( -1 == m_iniThunder )
wcscpy(&m_iniThunder,gameset->Key[5]);
m_iniBombSel = atoi((char*)gameset->Key[6]);
if(1 == gameset->iAutoFire)
m_iniAutoFire = TRUE;
else
m_iniAutoFire = FALSE;
CloseHandle(hf);
ZeroMemory(gameset,sizeof(CGameSet));
if(NULL != gameset)
delete gameset;
}
//------------------------------------------------------------------------------
//从配置文件中加载
void CGame::LoadAscii(TCHAR &sr,TCHAR *s)
{
if( 0 == wcscmp(s,TEXT("SHIFT")) )
sr = 0x10;
else if( 0 == wcscmp(s,TEXT("CONTROL")) )
sr = 0x11;
else if( 0 == wcscmp(s,TEXT("SPACE")) )
sr = 0x20;
else if( 0 == wcscmp(s,TEXT("LEFT")) )
sr = 0x25;
else if( 0 == wcscmp(s,TEXT("UP")) )
sr = 0x26;
else if( 0 == wcscmp(s,TEXT("RIGHT")) )
sr = 0x27;
else if( 0 == wcscmp(s,TEXT("DOWN")) )
sr = 0x28;
else
sr = -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -