📄 winmain.cpp
字号:
{//移动敌机---------
planee[u].y+=planee_v;
if(planee[u].y-plane.y<0)//敌机是不是在我机的上面-------------
{if(planee[u].x-plane.x<0)
planee[u].x++;//敌机在我机左边,则敌机向右-----
else if(planee[u].x-plane.x>0)
planee[u].x--;//敌机在我机右边,则敌机向左------
}
//完成移动---------------
//是否敌机与我机相撞————————————————
//基于难度考虑没有加此模块-----------------------------
// if(planee[u].x
//敌机是否越界----------------
if(planee[u].y>planee_y_max | planee[u].x>planee_x_max)
{planee[u].stat=-1;
p_e_n--;//敌机数减一----------
if(p_e_n<0)
p_e_n=0;
if(p_e_n>planee_num)
p_e_n=planee_num;
}
//是否发弹---------------
if(f_e_n<firee_num)//子弹数是否到最多==-------
{if((rand()%20)==2)//随机决定是否发弹-----------------
{
for(n=0;n<firee_num;n++)//找出哪个子弹为空------
{if(firee[n].stat==0)//找到为空的子弹
{firee[n].stat=1;//将子弹位置1,即子弹不为空
xx=plane.x+25;
yy=plane.y+31;
firee[n].x=planee[u].x+22;
firee[n].y=planee[u].y+50;
dx=xx-firee[n].x;
dy=yy-firee[n].y;
firee[n].yv=(int)( (firee_v*dy) / sqrt(dx*dx+dy*dy) );
firee[n].xv=(int)( (firee_v*dx) / sqrt(dx*dx+dy*dy) );
f_e_n++;//子弹数加一---------
//发出敌机子弹的声音-------------
//所加声音不好听,所以不加-
//firee_s[n].dsbuffer->SetPan(-(33*dx));
//firee_s[n].dsbuffer->Play(0,0,0);
break;
}
}
}
}//结束----子弹数是否到最多==-------
//结束——————是否发弹----
}
}
}
//结束是否有敌机----------
//结束对敌机的操作---------------
//操作敌机子弹-------
if(f_e_n>0)
{for(u=0;u<firee_num;u++)//对每个子弹操作---
{if(firee[u].stat==1)
{firee[u].y+=firee[u].yv;
firee[u].x+=firee[u].xv;
//是否越界-----
if( firee[u].y<2 | firee[u].x<2 | firee[u].x>firee_x_max |firee[u].y>firee_y_max)
{firee[u].stat=0;
f_e_n--;//敌机子弹减一---------
break;
}
//是否打中我机-------
if( firee[u].y>(plane.y+10) & firee[u].y<(plane.y+62) & firee[u].x>(plane.x+10) & firee[u].x<(plane.x+40))
{bb=0;
end=3;
gameover_s.dsbuffer->Play(0,0,0);
Sleep(600);
return (1);
}
}
}//结束对每个子弹的操作
}
//结束————操作敌机子弹----
//显示分数和难度-----------------------
lpddsback->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddbltfx);
lpddsback->GetDC(&my_dc);
movestar();
SetTextColor(my_dc,RGB(0,100,100));
//SetBkColor(my_dc,RGB(0,0,0));
SetBkMode(my_dc,TRANSPARENT);//OPAQUE
sprintf(buffer,"分数:%d 难度:%d",sco,grade);
TextOut(my_dc,700,0,buffer,strlen(buffer));
lpddsback->ReleaseDC(my_dc);
//显示自己的子弹-------------------
my_rect(108,62,121,88);
if(plane.num>0)
{ for(u=0;u<fire_num;u++)
{if(fire[u].stat==1)
lpddsback->BltFast(fire[u].x,fire[u].y,lpddsplane,&rect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
}
}
//显示自己的飞机---------------------
my_rect(plane.stat*50,0,plane.stat*50+50,62);
plane.stat=0;
lpddsback->BltFast(plane.x,plane.y,lpddsplane,&rect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
//显示敌人的子弹--------------------------
if(f_e_n>0)
{ my_rect(108,88,121,103);
for(u=0;u<firee_num;u++)
{if(firee[u].stat==1)
lpddsback->BltFast(firee[u].x,firee[u].y,lpddsplane,&rect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
}
}
//显示敌人的飞机机--------------------
if(p_e_n>0)
{ for(u=0;u<planee_num;u++)
{if(planee[u].stat==0)
{my_rect(0,62,54,112);
lpddsback->BltFast(planee[u].x,planee[u].y,lpddsplane,&rect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
}
if(planee[u].stat==1)
{if(p==15)
{planee[u].stat=-1;
p_e_n--;
if(p_e_n<0)
p_e_n=0;
}
my_rect(54,62,108,112);
lpddsback->BltFast(planee[u].x,planee[u].y,lpddsplane,&rect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
}
}
}
//--------------p用来记录幅数-------------------
p++;
if(p==30)
p=0;
//----------------控制时间--------------------
while((GetTickCount() - STAR_TIME) < 33)
{}
//------------------------翻页--------------------
if(FAILED(lpddsprimary->Flip(NULL,DDFLIP_WAIT)))
{sprintf(buffer,"x=%d,y=%d",plane.x,plane.y);
t=MessageBox(my_hwnd,buffer,"lpddsprimary->Flip",MB_OKCANCEL | MB_ICONQUESTION );
if ( t==IDCANCEL )
PostQuitMessage(0);
}
//返回--------------------------------------------
return(1);
}
//--------------------------------------------------- end Game_Main-------------------------
////////////////////////////////////////////////////////////
//-------------------------------------------------用来初始化DirectDraw和DirectSound----------
int Game_Init(void *parms = NULL, int num_parms = 0)
{
LPDIRECTDRAW lpdd_temp;
// first create base IDirectDraw interface
if (FAILED(DirectDrawCreate(NULL, &lpdd_temp, NULL)))
return(1);
// now query for IDirectDraw4
if (FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,
(LPVOID *)&lpdd)))
return(1);
// set cooperation to full screen
if (FAILED(lpdd->SetCooperativeLevel(my_hwnd,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
return(2);
// set display mode
if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
return(3);
// clear ddsd and set size
INIT_DDSD(ddsd);
// enable valid fields
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
// set the backbuffer count field to 1, use 2 for triple buffering
ddsd.dwBackBufferCount = 1;
// request a complex, flippable
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
// create the primary surface
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
return(4);
// now query for attached surface from the primary surface
// this line is needed by the call
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
// get the attached back buffer surface
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
return(5);
// build up the palette data array
for (int color=1; color < 255; color++)
{
// fill with random RGB values
palette[color].peRed = rand()%256;
palette[color].peGreen = rand()%256;
palette[color].peBlue = rand()%256;
// set flags field to PC_NOCOLLAPSE
palette[color].peFlags = PC_NOCOLLAPSE;
} // end for color
// now fill in entry 0 and 255 with black and white
palette[0].peRed = 0;
palette[0].peGreen = 0;
palette[0].peBlue = 0;
palette[0].peFlags = PC_NOCOLLAPSE;
palette[255].peRed = 255;
palette[255].peGreen = 255;
palette[255].peBlue = 255;
palette[255].peFlags = PC_NOCOLLAPSE;
// create the palette object
if (FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 |
DDPCAPS_INITIALIZE,
palette,&lpddpal, NULL)))
return(6);
// finally attach the palette to the primary surface
if (FAILED(lpddsprimary->SetPalette(lpddpal)))
return(6);
// clean the surfaces
INIT_DDSD(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth=150;
ddsd.dwHeight=112;
lpdd->CreateSurface(&ddsd,&lpddsplane,NULL);
DDCOLORKEY color_key;
color_key.dwColorSpaceHighValue=0;
color_key.dwColorSpaceLowValue=0;
lpddsplane->SetColorKey(DDCKEY_SRCBLT,&color_key);
//DDBLTFX ddBltFx;
ddbltfx.dwSize=sizeof(DDBLTFX);
ddbltfx.dwFillPixel=0;
lpddsprimary->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddbltfx);
lpddsback->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddbltfx);
lpddsplane->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddbltfx);
DDReLoadBitmap(lpddsplane,"2.bmp");
//-------------------------------------初始化directsound-------------------------------------------------------------------
if (DirectSoundCreate(NULL, &lpds, NULL)!=DS_OK )
return(0);
// set cooperation level
if (lpds->SetCooperativeLevel(my_hwnd,DSSCL_NORMAL)!=DS_OK)
return(0);
//初始化声音-----
for(int w=0;w<7;w++)
bb_s[w].state=0;
for(int w=0;w<fire_num;w++)
fire_s[w].state=0;
for(int w=0;w<planee_num;w++)
planee_s[w].state=0;
plane_s.state=0;
gameover_s.state=0;
gamepast_s.state=0;
gamepause_s.state=0;
DSound_Load_WAV( &gamepause_s,"pause.wav");//加声音-----------------
DSound_Load_WAV( &gamepast_s,"gamepast.wav");
DSound_Load_WAV( &gameover_s,"plane_d.wav");
DSound_Load_WAV( &plane_s,"plane_d.wav");
DSound_Load_WAV( &bb_s[0],"bb.wav");
if( DSound_Load_WAV( &fire_s[0],"plane_f.wav")==0 )
MessageBox(my_hwnd,"DSound_Load_plane_f.wav","slkdfj",MB_OK | MB_ICONQUESTION);
//敌机子弹的声音------由于不好听,所以我没加------------
//if(DSound_Load_WAV( &firee_s[0],"planee_f.wav")==0)
// MessageBox(my_hwnd,"DSound_Load_planee_f.wav","slkdfj",MB_OK | MB_ICONQUESTION);
if(DSound_Load_WAV( &planee_s[0],"planee_d.wav")==0)
MessageBox(my_hwnd,"DSound_Load_planee_d.wav","slkdfj",MB_OK | MB_ICONQUESTION);
int qw;
//for(int w=1;w<FIREE_NUM;w++)
// qw=DSound_Replicate_Sound(firee_s,w);
// if(qw==-1)
// MessageBox(my_hwnd,"DSound_Replicate_Sound","slkdfj",MB_OK | MB_ICONQUESTION);
//}
for(int w=1;w<FIRE_NUM;w++)
{qw=DSound_Replicate_Sound(fire_s,w);
if(qw==-1)
MessageBox(my_hwnd,"DSound_Replicate_Sound","slkdfj",MB_OK | MB_ICONQUESTION);
}
for(int w=1;w<PLANEE_NUM;w++)
DSound_Replicate_Sound(planee_s,w);
for(int w=1;w<10;w++)
DSound_Replicate_Sound(bb_s,w);
for(int w=0;w<FIRE_NUM;w++)
fire_s[w].dsbuffer->SetVolume(-1200);
for(int w=0;w<PLANEE_NUM;w++)
planee_s[w].dsbuffer->SetVolume(-1000);
plane_s.dsbuffer->SetVolume(500);
//----------------------------------------初始化DirectMusic-------------------------------------
DMusic_Init( );
qw=DMusic_Load_MIDI(&dmusic[0],"1.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:1.mid",buffer,MB_OK | MB_ICONQUESTION);
}
qw=DMusic_Load_MIDI(&dmusic[1],"2.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:2.mid",buffer,MB_OK | MB_ICONQUESTION);
}
qw=DMusic_Load_MIDI(&dmusic[2],"3.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:3.mid",buffer,MB_OK | MB_ICONQUESTION);
}
qw=DMusic_Load_MIDI(&dmusic[3],"4.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:4.mid",buffer,MB_OK | MB_ICONQUESTION);
}
qw=DMusic_Load_MIDI(&dmusic[4],"5.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:5.mid",buffer,MB_OK | MB_ICONQUESTION);
}
qw=DMusic_Load_MIDI(&dmusic[5],"6.mid");
if(qw!=0)
{sprintf(buffer,"id=%d",qw);
MessageBox(my_hwnd,"加载MIDI音乐出错:6.mid",buffer,MB_OK | MB_ICONQUESTION);
}
grade=1;
for(int w=0;w<FIRE_NUM;w++)
fire[w].xv=((w+1)&3)-2;
//从mygame.ini中提取上次游戏的设置----------
FILE *fp;
if((fp=fopen("mygame.ini","r"))!=NULL)
{ fscanf(fp,"%d,%d,%d,%d,%d,%d,%d,%d,%d",&fire_stat,&star_stat,&star_num,&over_sco,&my_up,&my_down,&my_left,&my_right,&my_fire);
fclose(fp);
}
return(0);
}
// -----------------------------------------------------end Game_Init----------------------
/////////////////////////////////////////////////////////////
//---------------------------------------------------程序结束时用来释放资源--------------------
int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
// this is called after the game is exited and the main event
// loop while is exited, do all you cleanup and shutdown here
//---------------------------------保存设置到mygame.ini中------------------------------------
FILE *fp;
if((fp=fopen("mygame.ini","w"))!=NULL)
{ fprintf(fp,"%d,%d,%d,%d,%d,%d,%d,%d,%d",fire_stat,star_stat,star_num,over_sco,my_up,my_down,my_left,my_right,my_fire);
fclose(fp);
}
//------------------------------------------------------Unload Direct Music-----------------
dm_perf->Stop(NULL,NULL,0,0);
for (int index = 0; index < MUSIC_NUM; index++)
{
// Unload instruments this will cause silence.
// CloseDown unloads all instruments, so this call is also not
// strictly necessary.
if (dmusic[index].dm_segment)
{
dmusic[index].dm_segment->SetParam(GUID_Unload, -1, 0, 0, (void*)dm_perf);
// Release the segment and set to null
dmusic[index].dm_segment->Release();
dmusic[index].dm_segment = NULL;
dmusic[index].dm_segstate = NULL;
dmusic[index].state = MIDI_NULL;
} // end if
} // end for index
if (dm_perf)
dm_perf->Stop(NULL, NULL, 0, 0 );
// CloseDown and Release the performance object.
if (dm_perf)
{
dm_perf->CloseDown();
dm_perf->Release();
} // end if
// Release the loader object.
if (dm_loader)
dm_loader->Release();
// Release COM
CoUninitialize();
//----------------------------------------------------------Unload Direct Sound----------------
if(gamepause_s.dsbuffer)//暂停的声音-------
{gamepause_s.dsbuffer->Stop();
gamepause_s.dsbuffer->SetCurrentPosition(0);
gamepause_s.dsbuffer->Release();
gamepause_s.dsbuffer=NULL;
}
if(gamepast_s.dsbuffer)//过关的声音-----------------
{gamepast_s.dsbuffer->Stop();
gamepast_s.dsbuffer->SetCurrentPosition(0);
gamepast_s.dsbuffer->Release();
gamepast_s.dsbuffer=NULL;
}
if(gameover_s.dsbuffer)//gameover声音--------
{gameover_s.dsbuffer->Stop();
gameover_s.dsbuffer->SetCurrentPosition(0);
gameover_s.dsbuffer->Release();
gameover_s.dsbuffer=NULL;
}
if(plane_s.dsbuffer)//我机声音--------
{plane_s.dsbuffer->Stop();
plane_s.dsbuffer->SetCurrentPosition(0);
plane_s.dsbuffer->Release();
plane_s.dsbuffer=NULL;
}
for (int w=0;w<10;w++)//菜单的声音---------------
{if( bb_s[w].dsbuffer)
{bb_s[w].dsbuffer->Stop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -