📄 main.cpp
字号:
SetRect(&backR1, 0, 0, 640, 480);
SetRect(&frontR1, 0,0, 640, 480);
SetRect(&backR2, 0, 0, 150, 200);
SetRect(&frontR2, 245,260, 395, 460);
// 清屏后台缓冲区
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
// 将背景图象Blit到后台缓冲区
lpDDSBack->Blt(&frontR1, lpDDSPic1, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
lpDDSBack->Blt(&frontR2, lpDDSPic7, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
switch (iSelectMainMenuNo)
{
case 1:
SetRect(&backR3, 150, 0, 300, 50);
SetRect(&frontR3, 245,260, 395, 310);
break;
case 2:
SetRect(&backR3, 150, 50, 300, 100);
SetRect(&frontR3, 245,310, 395, 360);
break;
case 3:
SetRect(&backR3, 150, 100, 300, 150);
SetRect(&frontR3, 245,360, 395, 410);
break;
case 4:
SetRect(&backR3, 150, 150, 300, 200);
SetRect(&frontR3, 245,410, 395, 460);
break;
default:
SetRect(&backR3, 0, 0, 150, 200);
SetRect(&frontR3, 245,260, 395, 460);
break;
}
lpDDSBack->Blt(&frontR3, lpDDSPic7, &backR3, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// 打印刷新率fps
HDC hdc;
char temp[32];
lpDDSBack->GetDC(&hdc);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(0,255,0));
sprintf(temp, "%d 帧/秒", iFps);
TextOut(hdc, 0, 0, temp, strlen(temp));
lpDDSBack->ReleaseDC(hdc);
// 换页
while ( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); // 调用换页函数
if (ddrval == DD_OK ) // 成功则退出while循环
break;
if (ddrval == DDERR_SURFACELOST ) // 如果页面丢失,则恢复页面
{
ddrval = lpDDSPrimary->Restore(); // 恢复主页面
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic1->Restore(); // 恢复离屏页面1
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic7->Restore(); // 恢复离屏页面7
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPig->Restore(); // 恢复离屏页面pig
if (ddrval!=DD_OK)
break;
if (!InitThread())
break; // 重新提取背景
}
if (ddrval != DDERR_WASSTILLDRAWING)
break;
}
}
bool FreeThread()
{
switch (iThread)
{
case 0:
if (bSoundDrive)cDSound.Stop(0);
break;
case 999:
// FreeResource();
break;
default :
return false;
}
return true;
}
void QuitOneThread()
{
switch (iThread)
{
case 0: // info display
FreeThread();
cMidi.Play(hWndMain,"wav\\menu.mid");
iThread=1;
bInitAgain=true;
break;
case 1: // menu display
/*FreeThread();
iThread=2;
bInitAgain=true;
break;
case 2: // menu
// FreeThread();
// iThread=999;
// bInitAgain=true;*/
break;
case 3: // let go!!
FreeThread();
cMidi.Stop();
cMidi.ChangePlay("wav\\menu.mid");
iThread=1;
bInitAgain=true;
break;
case 999: // exit system
cMidi.Stop();
FreeResource();
PostQuitMessage(0);
break;
default:
FreeThread();
iThread=0;
bInitAgain=true;
break;
}
}
void LetGo() // 游戏开始...
{
RECT backR1, frontR1,backR2, frontR2,backR3, frontR3;
static bool bFireLeftFlag=false; //
static bool bAckFlag=false; //
static int iBoosX=200,iBoosY=10; //
static int iBack=1480; // 背景位置
int i,j;
switch (iMoveWay)
{
case 4:
if ((iFX-iFSpeed)>=0)
iFX-=iFSpeed;
else
iFX=0;
break;
case 6:
if ((iFX+iFSpeed)<=580)
iFX+=iFSpeed;
else
iFX=580;
break;
case 8:
if ((iFY-iFSpeed)>=0)
iFY-=iFSpeed;
else
iFY=0;
break;
case 2:
if ((iFY+iFSpeed)<=400)
iFY+=iFSpeed;
else
iFY=400;
break;
case 5: // 如果没有按下方向键
if (bTimeToUp2)
{
bTimeToUp2=false;
if (iFang>16)
iFang-=1; // 右返回
if (iFang<16)
iFang+=1; // 左返回
}
break;
}
// 清屏后台缓冲区 不作这步将出现拖尾现象
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
// 将背景图象Blit到后台缓冲区
SetRect(&backR3, 0, iBack, 640, iBack+480);
SetRect(&frontR3, 0, 0, 640, 480);
iBack--;
if (iBack<0)
iBack=2399;
if (iBack>1919)
{
SetRect(&backR3,0, iBack, 640, 2400);
SetRect(&frontR3, 0, 0, 640, 2400-iBack);
lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
SetRect(&backR3,0, 0, 640, 480-(2400-iBack));
SetRect(&frontR3, 0,2400-iBack , 640, 480);
lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
}
else
{
lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
}
static int iBoosHP=1000;
// if (iBoosY++>400)
// iBoosY=0;
// if (iBoosHP>800)
// iBoosY++;
if (bTimeToUp)
{
SetRect(&backR2, 510, 264, 524, 300);
// if (iBoosHP<300)
// iBoosY-=1;
}
else
SetRect(&backR2, 533, 264, 547,300);
for (i=0;i<2;i++) // 两颗飞弹轨迹
{
if (iBomY[i]-3>=0&&bBomBI[i])
{
iBomY[i]-=3;
if (iBomY[i]<iBoosY+50&&iBomY[i]>iBoosY&&iBomX[i]<iBoosX+90&&iBomX[i]>iBoosX+30)
{
iBoosHP-=5;
bAckFlag=true;
bBomBI[i]=false;
cDSound.Play(false,2);
}
}
else
{
iBoosHP+=1;
bFireLeftFlag=!bFireLeftFlag;
j=1;
if (bFireLeftFlag)
{
j=0;
}
iBomX[i]=iFX+6+j*34;
iBomY[i]=iFY+40;
bBomBI[i]=true;
cDSound.Play(false,4);
}
SetRect(&frontR2,iBomX[i],iBomY[i],iBomX[i]+14,iBomY[i]+36);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// 飞弹
}
SetRect(&backR1, iFang*60, 0, iFang*60+60, 80);
// 设置飞机样式
SetRect(&frontR1, iFX,iFY, iFX+60, iFY+80);
// 设置飞机位置
lpDDSBack->Blt(&frontR1, lpDDSPic2, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// 画出飞机
// if (bTimeToUp)
// SetRect(&backR1, 510, 286,524, 300);
// else
// SetRect(&backR1, 533, 286, 547,300);
// SetRect(&frontR1, iFX+23,iFY+83, iFX+37, iFY+97);
// lpDDSBack->Blt(&frontR1, lpDDSPic1, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// 尾气
SetRect(&backR2,350,390,490,460);
SetRect(&frontR2,iBoosX,iBoosY,iBoosX+140,iBoosY+70);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// A10
if (bAckFlag)
{
static int iAckDly=0;
SetRect(&backR2, iAckDly*65, 0, (iAckDly+1)*65, 65);
SetRect(&frontR2,iBoosX+43,iBoosY+20,iBoosX+108,iBoosY+85);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
// 击中
if (iAckDly<8)
iAckDly++;
else
{
iAckDly=0;
bAckFlag=false;
}
}
/*
SetRect(&backR2, 128, 450, 192, 480);
for(i=4;i<8;i++) // 背景在顶上流过
{
SetRect(&frontR2, 40+(i-4)*140,iBackY[i], (i-4)*140+104, iBackY[i]+30);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
if (bTimeToUp2_back)
iBackY[i]+=1;
if (iBackY[i]>400)iBackY[i]=0;
}*/
if (bTimeToUp2_back)
bTimeToUp2_back=false; // 标记背景已经刷新
for (i=0;i<iGameBom;i++)
{
// 显示保护数
SetRect(&backR2,0,290,20,305);
SetRect(&frontR2,i*20,430,i*20+20,445);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
}
for (i=0;i<iGameBlood;i++)
{
// 显示血
SetRect(&backR2,0,310,8,320);
SetRect(&frontR2,i*8,445,(i+1)*8,455);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
}
for (i=0;i<iGameLife;i++)
{
// 显示飞机数
SetRect(&backR2,0,260,20,292);
SetRect(&frontR2,i*20,448,i*20+20,480);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
}
if (iBoosHP>=0)
{
for(i=0;i<(iBoosHP/100+1);i++)
{
// 显示Boss
SetRect(&backR2,0,310,8,320);
SetRect(&frontR2,i*8+70,2,(i+1)*8+70,12);
lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
}
}
// 打印刷新率fps
HDC hdc;
char temp[32];
lpDDSBack->GetDC(&hdc);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(0,255,0));
sprintf(temp, "%d 帧/秒", iFps);
TextOut(hdc, 560, 0, temp, strlen(temp));
if (iBoosHP>=0)
{
sprintf(temp, "无敌金刚"); // %d", iBoosHP);
}
else
sprintf(temp,"要死不活 %d", iBoosHP);
TextOut(hdc, 0, 0, temp, strlen(temp));
lpDDSBack->ReleaseDC(hdc);
// 换页
HRESULT ddrval;
while ( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); // 调用换页函数
if (ddrval == DD_OK ) // 成功则退出while循环
break;
if (ddrval == DDERR_SURFACELOST ) // 如果页面丢失,则恢复页面
{
ddrval = lpDDSPrimary->Restore(); // 恢复主页面
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic1->Restore(); // 恢复离屏页面1
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic2->Restore(); // 恢复离屏页面2
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic8->Restore(); // 恢复离屏页面8
if (ddrval!=DD_OK)
break;
if (!InitThread())
break; // 重新提取背景
}
if (ddrval != DDERR_WASSTILLDRAWING)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -