📄 tankframe.cpp
字号:
}
}
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 + -