📄 fight.cpp
字号:
DDSCAPS ddscaps;
if(FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
{
MessageBox(hWnd,"failed in create lpdd","LPDD",NULL);
return FALSE;
}
if(FAILED(lpdd->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|
DDSCL_FULLSCREEN)))
{
MessageBox(hWnd,"failed in setcolevel","DDSCL",NULL);
return FALSE;
}
if(FAILED(lpdd->SetDisplayMode(800,600,32)))
{
MessageBox(hWnd,"failed in set display mode","SETMODE",NULL);
return FALSE;
}
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|
DDSCAPS_FLIP|
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;
if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL)))
{
MessageBox(hWnd,"failed in create primary","PRIMARY",NULL);
return FALSE;
}
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
if(FAILED(lpddsprimary->GetAttachedSurface(&ddscaps,&lpddsback)))
{
MessageBox(hWnd,"failed in attach","ATTACH",NULL);
return FALSE;
}
// 设置lpddsbackground的页面
ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
ddsd.dwHeight=600;
ddsd.dwWidth=800;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsbackground,NULL)))
{
MessageBox(hWnd ,"failed in create back ground","MAGROUND",NULL);
return FALSE;
}
if(FAILED(DDReLoadBitmap(lpddsbackground,"ground.bmp")))
{
MessageBox(hWnd,"failed in Load GROUND","LOADGROUND",NULL);
return FALSE;
}
//设置lpddsmap页面
ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
ddsd.dwHeight=60;
ddsd.dwWidth=60;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsmap,NULL)))
{
MessageBox(hWnd ,"failed in create map","MAP",NULL);
return FALSE;
}
if(FAILED(DDReLoadBitmap(lpddsmap,"mpfield.bmp")))
{
MessageBox(hWnd,"failed in Load map","LOADMAP",NULL);
return FALSE;
}
//设置lpddsflame页面
ddsd.dwHeight=66;
ddsd.dwWidth=528;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsflame,NULL)))
{
MessageBox(hWnd,"failed in create flame","FLAME",NULL);
return FALSE;
}
if(FAILED(DDReLoadBitmap(lpddsflame,"flame.bmp")))
{
MessageBox(hWnd,"failed load flame","LOADFLAME",NULL);
return FALSE;
}
if(FAILED(DDSetColorKey(lpddsflame,CLR_INVALID)))
{
MessageBox(hWnd,"failed in set color","FLAMECOLOR",NULL);
return FALSE;
}
//设置lpddsplane(飞机)页面
ddsd.dwWidth=50;
ddsd.dwHeight=60;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
lpdd->CreateSurface(&ddsd,&lpddsplane[0],NULL);
lpdd->CreateSurface(&ddsd,&lpddsplane[2],NULL);
DDReLoadBitmap(lpddsplane[0],"plane.bmp");
DDReLoadBitmap(lpddsplane[2],"plane2.bmp");
DDSetColorKey(lpddsplane[0],RGB(0,0,0));
DDSetColorKey(lpddsplane[2],RGB(0,0,0));
ddsd.dwWidth=60;
ddsd.dwHeight=50;
lpdd->CreateSurface(&ddsd,&lpddsplane[1],NULL);
lpdd->CreateSurface(&ddsd,&lpddsplane[3],NULL);
DDReLoadBitmap(lpddsplane[1],"plane1.bmp");
DDReLoadBitmap(lpddsplane[3],"plane3.bmp");
DDSetColorKey(lpddsplane[1],RGB(0,0,0));
DDSetColorKey(lpddsplane[3],RGB(0,0,0));
//设置lpddsenemy(敌机)页面
ddsd.dwHeight=35;
ddsd.dwWidth=35;
lpdd->CreateSurface(&ddsd,&lpddsenemy[0],NULL);
lpdd->CreateSurface(&ddsd,&lpddsenemy[1],NULL);
lpdd->CreateSurface(&ddsd,&lpddsenemy[2],NULL);
lpdd->CreateSurface(&ddsd,&lpddsenemy[3],NULL);
DDReLoadBitmap(lpddsenemy[0],"enemy.bmp");
DDReLoadBitmap(lpddsenemy[1],"enemy1.bmp");
DDReLoadBitmap(lpddsenemy[2],"enemy2.bmp");
DDReLoadBitmap(lpddsenemy[3],"enemy3.bmp");
DDSetColorKey(lpddsenemy[0],CLR_INVALID);
DDSetColorKey(lpddsenemy[1],CLR_INVALID);
DDSetColorKey(lpddsenemy[2],CLR_INVALID);
DDSetColorKey(lpddsenemy[3],CLR_INVALID);
//设置lpddsfire(子弹)页面
ddsd.dwHeight=36;
ddsd.dwWidth=14;
lpdd->CreateSurface(&ddsd,&lpddsfire[0],NULL);
lpdd->CreateSurface(&ddsd,&lpddsfire[2],NULL);
DDReLoadBitmap(lpddsfire[0],"fire.bmp");
DDReLoadBitmap(lpddsfire[2],"fire2.bmp");
DDSetColorKey(lpddsfire[0],CLR_INVALID);
DDSetColorKey(lpddsfire[2],CLR_INVALID);
ddsd.dwHeight=14;
ddsd.dwWidth=36;
lpdd->CreateSurface(&ddsd,&lpddsfire[1],NULL);
lpdd->CreateSurface(&ddsd,&lpddsfire[3],NULL);
DDReLoadBitmap(lpddsfire[1],"fire1.bmp");
DDReLoadBitmap(lpddsfire[3],"fire3.bmp");
DDSetColorKey(lpddsfire[1],CLR_INVALID);
DDSetColorKey(lpddsfire[3],CLR_INVALID);
//设置lpddstree(树)页面
ddsd.dwHeight=30;
ddsd.dwWidth=30;
lpdd->CreateSurface(&ddsd,&lpddstree[0],NULL);
lpdd->CreateSurface(&ddsd,&lpddstree[1],NULL);
lpdd->CreateSurface(&ddsd,&lpddstree[2],NULL);
DDReLoadBitmap(lpddstree[0],"mptree.bmp");
DDReLoadBitmap(lpddstree[1],"mptree1.bmp");
DDReLoadBitmap(lpddstree[2],"mptree2.bmp");
DDSetColorKey(lpddstree[0],RGB(0,0,0));
DDSetColorKey(lpddstree[1],RGB(0,0,0));
DDSetColorKey(lpddstree[2],RGB(0,0,0));
//取得当前路径
_getcwd( apppath, sizeof(apppath));
strcpy(openmidi, "play ");
strcat(openmidi, apppath);
strcat(openmidi, "\\a.mid");
strcpy(closemidi, "close ");
strcat(closemidi, apppath);
strcat(closemidi, "\\a.mid");
strcpy(stopmidi, "stop");
strcat(stopmidi, apppath);
strcat(stopmidi, "\\a.mid");
//播放midi
char buf[256];
mciSendString(openmidi, buf, sizeof(buf), NULL);
return TRUE;
}
//**************************************************
//初始化飞机、树等的数据;
//**************************************************
void InitData(void)
{
A11.x=400;
A11.y=400;//初始化的飞机坐标
A11.width=50;
A11.height=60;
A11.planestatus=super;
A11.speed=4*GameSpeed;
A11.lifenum=3;
A11.bfire=TRUE;//不能发射子弹
A11.direct=Aup;
A11.bdead=TRUE;//死亡
supertime=0;
Amap.height=60;
Amap.width=60;
Amap.x=0;
Amap.y=0;
for(int i=0;i<cenemy;i++)
{
Aenemy[i].bfire=FALSE;//能发射子弹
Aenemy[i].bdead=TRUE;//死亡
Aenemy[i].direct=rand()%4;
Aenemy[i].height=35;
Aenemy[i].width=35;
Aenemy[i].speed=2*GameSpeed;
Aenemy[i].x=100;
Aenemy[i].y=50;
}
for(i=0;i<cenemy;i++)
{
Aflame[i].height=66;
Aflame[i].width=66;
Aflame[i].x=100;
Aflame[i].y=0;
Aflame[i].ftps=0;
Aflame[i].bdead=TRUE;
}
for(i=0;i<cenemy;i++)
{
Afire[i].Efire=0;
Afire[i].height=36;
Afire[i].width=14;
Afire[i].bdead=TRUE;
Afire[i].direct=Aup;
Afire[i].speed =7*GameSpeed;
Afire[i].type =Fplane;
Afire[i].x=100;
Afire[i].y=0;
}
for(i=0;i<ctree;i++)
{
Atree[i].height=30;
Atree[i].width=30;
Atree[i].type=rand()%3;
Atree[i].x=rand()%570+leftblank;
Atree[i].y=rand()%570;
}
}
//**************************************************
//画地图:第一层画地表,第儿层画树
//**************************************************
bool DrawMap(void)
{
if(FAILED(lpddsback->BltFast(0,0,lpddsbackground,NULL,DDBLTFAST_WAIT)))
{
MessageBox(hWnd,"failed blt ground",NULL,NULL);
return FALSE;
}
for(int i=0;i<cmap;i++)
for(int j=0;j<cmap;j++)
{
if(FAILED(lpddsback->BltFast((leftblank+i*Amap.width),
j*Amap.height,
lpddsmap,NULL,DDBLTFAST_WAIT)))
{
MessageBox(hWnd,"failed draw map","DRAWMAP",NULL);
return FALSE;
}
}
for(i=0;i<ctree;i++)
{
if(FAILED(lpddsback->BltFast(Atree[i].x,Atree[i].y,
lpddstree[Atree[i].type],NULL,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw tree","DRAWTREE",NULL);
return FALSE;
}
}
return TRUE;
}
//*************************************************
//画飞机
//*************************************************
bool DrawPlane(void)
{
static int ot,nt,lt;//分别代表:久时间、现在时间、无敌持续时间;
if(gamestatus==GameOver)return TRUE;
if(A11.bdead)return TRUE;
if(A11.y< 0 ){A11.y=0 ;}
if(A11.y>540){A11.y=540;}
if(A11.planestatus==super)
{
A11.bfire=TRUE;
supertime++;
if(supertime==80)
{
A11.planestatus=control;
supertime=0;
A11.bfire=FALSE;
}
nt=GetTickCount();
if((nt-ot)>35)
{
ot=GetTickCount();
if(FAILED(lpddsback->BltFast(A11.x,A11.y,
lpddsplane[A11.direct],NULL,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
return FALSE;
}
}
}
else
{
if(FAILED(lpddsback->BltFast(A11.x,A11.y,
lpddsplane[A11.direct],NULL,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
return FALSE;
}
}
for(int i=0;i<A11.lifenum-1;i++)
{
if(FAILED(lpddsback->BltFast(i*50,20,
lpddsplane[Aup],NULL,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
return FALSE;
}
}
return TRUE;
}
//**********************************************
//画敌机
//**********************************************
bool DrawEnemy(void)
{
if(gamestatus==GameOver)return TRUE;
// if(gamestatus==GamePass)return TRUE;
for(int i=0;i<gamerank;i++)
{
if(!Aenemy[i].bdead)
{
if(FAILED(lpddsback->BltFast(Aenemy[i].x,Aenemy[i].y,
lpddsenemy[Aenemy[i].direct],NULL,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in blt enemy","DRAWENEMY",NULL);
return FALSE;
}
}
}
int x=0;
int y=0;
for(i=0;i<nsorce;i++)
{
if(y>15){x=1;y=0;}
if(FAILED(lpddsback->BltFast(700+x*35,(y*35+10),
lpddsenemy[Aup],NULL,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in blt enemy","DRAWENEMY",NULL);
return FALSE;
}
y++;
}
return TRUE;
}
//************************************************************
//画子弹:
//************************************************************
bool DrawFire(void)
{
if(gamestatus==GameOver)return TRUE;
for(int i=0;i<cenemy;i++)
{
if(!Afire[i].bdead )
{
if(Afire[i].x<102)Afire[i].x=100;
if(Afire[i].x>660)Afire[i].x=664;
if(Afire[i].y<10 )Afire[i].y=0 ;
if(Afire[i].y>560)Afire[i].y=564;
if(FAILED(lpddsback->BltFast(Afire[i].x ,Afire[i].y,
lpddsfire[Afire[i].direct],NULL,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw fire","DRAWFIRE",NULL);
return FALSE;
}
}
}
return TRUE;
}
//************************************************************
//画爆炸效果
//************************************************************
bool DrawFlame(void)
{
RECT srect;
for(int i=0;i<cenemy;i++)
{
if(!Aflame[i].bdead)
{
GetRect(&srect,Aflame[i].ftps*66,0,66,66);
if(Aflame[i].x<100){Aflame[i].x=100;}
if(Aflame[i].x>640){Aflame[i].x=640;}
if(Aflame[i].y<0 ){Aflame[i].y=0 ;}
if(Aflame[i].y>530){Aflame[i].y=530;}
if(FAILED(lpddsback->BltFast(Aflame[i].x,Aflame[i].y,
lpddsflame,&srect,
DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY)))
{
MessageBox(hWnd,"failed in draw flame","DRAWFLAME",NULL);
return FALSE;
}
static int otime[cenemy];
if(GetTickCount()-otime[i]>100)
{
otime[i]=GetTickCount();
Aflame[i].ftps++;
if(Aflame[i].ftps==4)
{
PlaySound();
}
if(Aflame[i].ftps==8)
{
// PlaySound("shot.wav",NULL,0);
Aflame[i].height=66;
Aflame[i].width=66;
Aflame[i].x=100;
Aflame[i].y=0;
Aflame[i].ftps=0;
Aflame[i].bdead=TRUE;
}
}
}
}
return TRUE;
}
//*******************************************************
//处理各数据的变化
//*******************************************************
void DataPro(void)
{
if(gamestatus==GameOver)return;
if(A11.lifenum<=0){A11.bdead=TRUE;gamestatus=GameOver;}
if(!A11.bdead)
{
if(A11.direct==Aup){A11.y-=A11.speed ;}
if(A11.direct==Aright){A11.x+=A11.speed;}
if(A11.direct==Adown){A11.y+=A11.speed;}
if(A11.direct==Aleft){A11.x-=A11.speed;}
}
for(int i=0;i<gamerank;i++)
{
if(!Aenemy[i].bdead)
{
if(Aenemy[i].direct==Aup){Aenemy[i].y-=Aenemy[i].speed;}
if(Aenemy[i].direct==Aright){Aenemy[i].x+=Aenemy[i].speed;}
if(Aenemy[i].direct==Adown){Aenemy[i].y+=Aenemy[i].speed;}
if(Aenemy[i].direct==Aleft){Aenemy[i].x-=Aenemy[i].speed;}
}
}
for( i=0;i<cenemy;i++)
{
if(!Afire[i].bdead)
{
if(Afire[i].direct==Aup){Afire[i].y-=Afire[i].speed;}
if(Afire[i].direct==Aright){Afire[i].x+=Afire[i].speed;}
if(Afire[i].direct==Adown){Afire[i].y+=Afire[i].speed;}
if(Afire[i].direct==Aleft){Afire[i].x-=Afire[i].speed;}
}
}
}
//*****************************************************
//构造rect
//*****************************************************
void GetRect(RECT *srect,long x ,long y,long height,long width)
{
srect->left=x;
srect->top=y;
srect->right=x+width;
srect->bottom=y+height;
return;
}
//**********************************************************
//翻转主从页面
//**********************************************************
void Flip(void)
{
HRESULT rval;
while (1)
{
rval=lpddsprimary->Flip(NULL, DDFLIP_WAIT);
if(rval == DDERR_SURFACELOST) lpddsprimary->Restore();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -