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

📄 tankframe.cpp

📁 疯狂坦克源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  }
 }	 
 else if(nChar==config.select)//选择键
 {
  if(mode.gamestatus==0)
  {
   spd=420;
   if(config.playernum==1)config.playernum=2;
   else config.playernum=1;
  }
 }	   
 else if(nChar==config.p1up)
 { 
  if(mode.gamestatus==0&&mode.stage<99)mode.stage++;//选关
 }
 else if(nChar==config.p1down)
 { 
  if(mode.gamestatus==0&&mode.stage>0)mode.stage--;//选关
 } 
 if(players[0].status!=0)
 {
  if(nChar==config.p1left)players[0].CtrlD=1;//1P左
  else if(nChar==config.p1up)players[0].CtrlD=2;//1P上
  else if(nChar==config.p1right)players[0].CtrlD=3;//1P右  
  else if(nChar==config.p1down)players[0].CtrlD=4;//1P下
  else if(nChar==config.p1fire)players[0].CtrlF=1;//1P开火
 }
 if(config.playernum==2&&players[1].status!=0)
 {
  if(nChar==config.p2left)players[1].CtrlD=1;//2P左 
  else if(nChar==config.p2up)players[1].CtrlD=2;//2P上
  else if(nChar==config.p2right)players[1].CtrlD=3;//2P右
  else if(nChar==config.p2down)players[1].CtrlD=4;//2P下
  else if(nChar==config.p2fire)players[1].CtrlF=1;//2P开火
 }
                  	
 CWnd::OnKeyDown(nChar,nRepCnt,nFlags);//默认
}

/*--------------------------------------
响应按键抬起消息
---------------------------------------*/
void CTankFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
 
 if(players[0].status!=0)
 {
  if(nChar==config.p1left||nChar==config.p1up||
     nChar==config.p1right||nChar==config.p1down)players[0].CtrlD=0;//方向控制无效
  else if(nChar==config.p1fire)players[0].CtrlF=0;//开火无效
 }
 if(config.playernum==2&&players[1].status!=0)
 {
  if(nChar==config.p2left||nChar==config.p2up||
     nChar==config.p2right||nChar==config.p2down)players[1].CtrlD=0;//方向控制无效
  else if(nChar==config.p2fire)players[1].CtrlF=0;//开火无效
 }
  
 CWnd::OnKeyUp(nChar, nRepCnt, nFlags);//默认
}

/*--------------------------------------
midi音乐播完后消息处理
---------------------------------------*/
void CTankFrame::OnMciNotify(WPARAM wFlags,LONG lDevID)
{
 mciSendCommand(wDeviceID,MCI_CLOSE,MCI_WAIT,NULL);
 if(strcmp(fname,"start.mid")&&wFlags==MCI_NOTIFY_SUCCESSFUL)PlayMid();//如果不是开始音乐就重播 
}

/*----------------------------------------
释放所有ddraw对象
----------------------------------------*/
void CTankFrame::ReleaseObjects()
{
 if(lpDD!=NULL)//ddraw对象
 {
  if(lpDDSPrimary!=NULL)
  {
   lpDDSPrimary->Release();
   lpDDSPrimary=NULL;
  }
  if(lpDDSOtank!=NULL)
  {
   lpDDSOtank->Release();
   lpDDSOtank=NULL;
  }
  if(lpDDSShot!=NULL)
  {
   lpDDSShot->Release();
   lpDDSShot=NULL;
  }
  if(lpDDSTank!=NULL)
  {
   lpDDSTank->Release();
   lpDDSTank=NULL;
  }
  if(lpDDSGround!=NULL)
  {
   lpDDSGround->Release();
   lpDDSGround=NULL;
  }
  if(lpDDSMap!=NULL)
  {
   lpDDSMap->Release();
   lpDDSMap=NULL;
  }
  lpDD->Release();
  lpDD=NULL;
 }
}

/*----------------------------
初始化dsound
-----------------------------*/
BOOL CTankFrame::InitDsound()
{
 HRESULT hr;
 
 if(FAILED(hr=DirectSoundCreate(NULL,&lpDS,NULL)))return FALSE;
 if(FAILED(hr=lpDS->SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY)))return FALSE;
 return TRUE;
}

/*---------------------------------------
播放由fname指出文件名的midi音乐
-----------------------------------------*/
void CTankFrame::PlayMid()
{
 MCI_OPEN_PARMS mciopen;
 MCI_PLAY_PARMS mciplay;
 
 mciopen.lpstrElementName=fname;
 mciopen.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_SEQUENCER;
 if(mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID
                    |MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciopen)!=0)
   Fail("不能打开背景音乐,请查看安装文件是否完整。");
  wDeviceID=mciopen.wDeviceID;
  mciplay.dwCallback=(DWORD)GetSafeHwnd();
  mciplay.dwFrom=0;
  if(mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)&mciplay)!=0)
   Fail("播放文件错误!");//播放背景音乐 
} 

/*--------------------------------------
释放dsound对象
---------------------------------------*/
void CTankFrame::Cleanup()
{ 
 if(lpDS)
 {
  if(lpDSBFire)
  {
   lpDSBFire->Release();
   lpDSBFire=NULL;
  }
  if(lpDSBExplo)
  {
   lpDSBExplo->Release();
   lpDSBExplo=NULL;
  }  
  lpDS->Release(); 
 }
}

/*------------------------------------------------
将多媒体文件中的声音加载到静态缓冲区中(microsoft)
-------------------------------------------------*/
BOOL CTankFrame::LoadStatic(LPDIRECTSOUND lpds,LPSTR lpzFileName,
                            LPDIRECTSOUNDBUFFER &lpdsbStatic)
{
 WAVEFORMATEX *pwfx;
 HMMIO hmmio;
 MMCKINFO mmckinfo;
 MMCKINFO mmckinfoParent;
 
 if(WaveOpenFile(lpzFileName,&hmmio,&pwfx,&mmckinfoParent)!=0)return FALSE;
 if(WaveStartDataRead(&hmmio,&mmckinfo,&mmckinfoParent)!=0)return FALSE;
    
 DSBUFFERDESC dsbdesc;
 
 if(lpdsbStatic==NULL)
 {
  memset(&dsbdesc,0,sizeof(DSBUFFERDESC)); 
  dsbdesc.dwSize=sizeof(DSBUFFERDESC); 
  dsbdesc.dwFlags=DSBCAPS_STATIC|DSBCAPS_CTRLVOLUME; 
  dsbdesc.dwBufferBytes=mmckinfo.cksize;  
  dsbdesc.lpwfxFormat=pwfx; 
 
  if(FAILED(lpds->CreateSoundBuffer(&dsbdesc,&lpdsbStatic,NULL)))
  {
   WaveCloseReadFile(&hmmio,&pwfx);
   return FALSE; 
  }
 }
 
 LPVOID lpvAudio1;
 DWORD dwBytes1;

 if(FAILED(lpdsbStatic->Lock(0,0,&lpvAudio1,&dwBytes1,
           NULL,NULL,DSBLOCK_ENTIREBUFFER)))
 {
  WaveCloseReadFile(&hmmio,&pwfx);
  return FALSE;
 }
 
 UINT cbBytesRead;
 
 if(WaveReadFile(hmmio,dwBytes1,(BYTE *)lpvAudio1,&mmckinfo,&cbBytesRead))
 {
  WaveCloseReadFile(&hmmio,&pwfx);
  return FALSE;
 }
 
 lpdsbStatic->Unlock(lpvAudio1,dwBytes1,NULL,0);
 WaveCloseReadFile(&hmmio,&pwfx);
 
 lpdsbStatic->SetVolume(-200);
 
 return TRUE;
}  

/*-----------------------------------------------------
打开一个多媒体文件(microsoft)
------------------------------------------------------*/
int CTankFrame::WaveOpenFile(TCHAR *pszFileName,HMMIO *phmmioIn,
                 WAVEFORMATEX **ppwfxInfo,MMCKINFO *pckInRIFF)
{
 HMMIO hmmioIn;
 MMCKINFO ckIn;
 PCMWAVEFORMAT pcmWaveFormat;       
 WORD cbExtraAlloc; 
 int nError;

 *ppwfxInfo=NULL;
 nError=0;
 hmmioIn=NULL;
    
 if((hmmioIn=mmioOpen(pszFileName,NULL,MMIO_ALLOCBUF|MMIO_READ))==NULL)
 {
  nError=ER_CANNOTOPEN;
  goto ERROR_READING_WAVE;
 }

 if((nError=(int)mmioDescend(hmmioIn,pckInRIFF,NULL,0))!=0)
 {
  goto ERROR_READING_WAVE;
 }

 if((pckInRIFF->ckid!=FOURCC_RIFF)||(pckInRIFF->fccType!=mmioFOURCC('W','A','V','E')))
 {
  nError=ER_NOTWAVEFILE;
  goto ERROR_READING_WAVE;
 }
 
 ckIn.ckid=mmioFOURCC('f','m','t',' ');
 if((nError=(int)mmioDescend(hmmioIn,&ckIn,pckInRIFF,MMIO_FINDCHUNK))!=0)
 {
  goto ERROR_READING_WAVE;                
 }
 
 if(ckIn.cksize<(long)sizeof(PCMWAVEFORMAT))
 {
  nError=ER_NOTWAVEFILE;
  goto ERROR_READING_WAVE;
 }
     
 if(mmioRead(hmmioIn,(HPSTR)&pcmWaveFormat,(long)sizeof(pcmWaveFormat))
             !=(long)sizeof(pcmWaveFormat))
 {
  nError=ER_CANNOTREAD;
  goto ERROR_READING_WAVE;
 }

 if(pcmWaveFormat.wf.wFormatTag==WAVE_FORMAT_PCM)cbExtraAlloc=0;                               
 else
 {
  if(mmioRead(hmmioIn,(LPTSTR)&cbExtraAlloc,
              (long)sizeof(cbExtraAlloc))!=(long)sizeof(cbExtraAlloc))
  {
   nError=ER_CANNOTREAD;
   goto ERROR_READING_WAVE;
  }
 }
 
 if ((*ppwfxInfo=(struct tWAVEFORMATEX *)GlobalAlloc(GMEM_FIXED,
                  sizeof(WAVEFORMATEX)+cbExtraAlloc))==NULL)
 {
  nError=ER_MEM;
  goto ERROR_READING_WAVE;
 }

 memcpy(*ppwfxInfo,&pcmWaveFormat,sizeof(pcmWaveFormat));
 (*ppwfxInfo)->cbSize=cbExtraAlloc;

 if(cbExtraAlloc!=0)
 {
  if(mmioRead(hmmioIn,(LPTSTR)(((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)),
              (long)(cbExtraAlloc))!=(long)(cbExtraAlloc))
  {
   nError=ER_NOTWAVEFILE;
   goto ERROR_READING_WAVE;
  }
 }
                                                            
 if((nError=mmioAscend(hmmioIn,&ckIn,0))!=0)
 {
  goto ERROR_READING_WAVE;
 }
 goto TEMPCLEANUP;               

ERROR_READING_WAVE:
 if(*ppwfxInfo!=NULL)
 {
  GlobalFree(*ppwfxInfo);
  *ppwfxInfo = NULL;
 }               
 if(hmmioIn!=NULL)
 {
  mmioClose(hmmioIn,0);
  hmmioIn = NULL;
 }
    
TEMPCLEANUP:
 *phmmioIn = hmmioIn;

 return(nError);
}

/*----------------------------------------------------
开始读取文件数据(microsoft)
-----------------------------------------------------*/
int CTankFrame::WaveStartDataRead(HMMIO *phmmioIn,MMCKINFO *pckIn,MMCKINFO *pckInRIFF)
{
 int nError;
 nError=0;
 if((nError=mmioSeek(*phmmioIn,pckInRIFF->dwDataOffset+sizeof(FOURCC),SEEK_SET))==-1)
 {
  _ASSERT(FALSE);
 }
 nError=0;
 
 pckIn->ckid=mmioFOURCC('d','a','t','a');
 if((nError=mmioDescend(*phmmioIn,pckIn,pckInRIFF,MMIO_FINDCHUNK))!=0)
 {
  goto ERROR_READING_WAVE;
 }

 goto CLEANUP;

ERROR_READING_WAVE:

CLEANUP:        
 return(nError);
}

/*-----------------------------------------
读取文件(microsoft)
------------------------------------------*/
int CTankFrame::WaveReadFile(HMMIO hmmioIn,UINT cbRead,BYTE *pbDest, 
                             MMCKINFO *pckIn,UINT *cbActualRead)
{
 MMIOINFO mmioinfoIn;
 int nError;
 UINT cT,cbDataIn;

 nError=0;
 if(nError=mmioGetInfo(hmmioIn,&mmioinfoIn,0)!=0)
 {
  goto ERROR_CANNOT_READ;
 }
 cbDataIn=cbRead;
 if(cbDataIn>pckIn->cksize)cbDataIn=pckIn->cksize;       
 pckIn->cksize-=cbDataIn;
 for(cT=0;cT<cbDataIn;cT++)
 {
  if(mmioinfoIn.pchNext==mmioinfoIn.pchEndRead)
  {
   if((nError=mmioAdvance(hmmioIn,&mmioinfoIn,MMIO_READ))!=0)
   {
    goto ERROR_CANNOT_READ;
   } 
   if(mmioinfoIn.pchNext==mmioinfoIn.pchEndRead)
   {
    nError=ER_CORRUPTWAVEFILE;
    goto ERROR_CANNOT_READ;
   }
  }
  *((BYTE*)pbDest+cT)=*(BYTE*)mmioinfoIn.pchNext++;                                                                                                   
 }

 if((nError=mmioSetInfo(hmmioIn,&mmioinfoIn,0))!=0)
 {
  goto ERROR_CANNOT_READ;
 }

 *cbActualRead=cbDataIn;
 goto FINISHED_READING;

ERROR_CANNOT_READ:
    *cbActualRead=0;

FINISHED_READING:
    return(nError);

}

/*-----------------------------------------
关闭多媒体文件(microsoft)
------------------------------------------*/
int CTankFrame::WaveCloseReadFile(HMMIO *phmmio,WAVEFORMATEX **ppwfxSrc)
{
 if(*ppwfxSrc!=NULL)
 {
  GlobalFree(*ppwfxSrc);
  *ppwfxSrc=NULL;
 }
 if(*phmmio!=NULL)
 {
  mmioClose(*phmmio, 0);
  *phmmio = NULL;
 }
 return(0);
}

/*---------------------------------
初始化ddraw环境
----------------------------------*/
BOOL CTankFrame::InitDdraw()
{
 DDSURFACEDESC ddsd;
 if(FAILED(DirectDrawCreate(NULL,&lpDD,NULL)))Fail("不能生成ddraw对象!");
 if FAILED(lpDD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN))
  Fail("不能设置协作模式!");
 if(FAILED(lpDD->SetDisplayMode(640,480,16)))Fail("不能设置显示模式!");
 if(FAILED(DDCreateFlipper(lpDD,&lpDDSPrimary,&lpDDSBack,1)))
  Fail("不能生成后备翻转页面!");
 /*生成地图表面*/
 ZeroMemory(&ddsd,sizeof(ddsd));
 ddsd.dwSize=sizeof(ddsd);
 ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
 ddsd.ddsCaps.dwCaps=0;
 ddsd.dwWidth=552;
 ddsd.dwHeight=432;
 if(FAILED(lpDD->CreateSurface(&ddsd,&lpDDSGround,NULL)))
  Fail("不能生成地图表面!");
 return TRUE;
}

/*-------------------------------------------
将位图装载到表面
--------------------------------------------*/
IDirectDrawSurface* CTankFrame::DDLoadBmp(IDirectDraw *pdd,LPCSTR szBitmap,int dx,int dy,
                                          DWORD dwFlags)
{
 HBITMAP hbm;
 BITMAP bm;
 DDSURFACEDESC ddsd;
 IDirectDrawSurface *pdds;
 
 hbm=(HBITMAP)LoadImage(GetModuleHandle(NULL),szBitmap,IMAGE_BITMAP,dx,dy,LR_CREATEDIBSECTION);
 if(hbm==NULL)
 hbm=(HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,dx,dy,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
 if(hbm==NULL)return NULL;
 GetObject(hbm, sizeof(bm), &bm);

 ZeroMemory(&ddsd,sizeof(ddsd));
 ddsd.dwSize=sizeof(ddsd);
 ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
 ddsd.ddsCaps.dwCaps=dwFlags;
 ddsd.dwWidth=bm.bmWidth;
 ddsd.dwHe

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -