⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 hfytdfgsfddhjghiufydstdfhgjhkl
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        {//移动敌机---------
		 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 + -