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

📄 ds.cpp

📁 一个完整的2D滚屏游戏示例
💻 CPP
字号:
//------ Include Files ------//
#include "stdafx.h"
#include "DS.h"
#include "wave.h"
#include "resource.h"
////////////////////////////////////////////////////////////////////////
//
CDS::CDS()
{
//add some special code here?
}

////////////////////////////////////////////////////////////////////////
//
CDS::~CDS()
{
Destroy();
}

bool CDS::Initialize(HWND hWnd,LPCSTR szSourceWave[DSOUND_MAX_NUM],int nSoundNum)
{
HRESULT      hr;

//(0)check sound number:
if(nSoundNum>DSOUND_MAX_NUM)goto Destroy;
m_nSoundNum=nSoundNum;

//(1)Create the DS object
hr=DirectSoundCreate(NULL, &m_lpDS, NULL);
if(hr!=DS_OK)goto Destroy;

//(2)Set the cooperation level for the DS object
hr=m_lpDS->SetCooperativeLevel(hWnd,DSSCL_NORMAL);
if(hr!=DS_OK)goto Destroy;

//(3)Initialize the DS buffers
if(!ReLoadSourceWaves(szSourceWave,m_nSoundNum))goto Destroy;
/*
LPCSTR szWave[88];
szWave[0]="main.wav";
if(!ReLoadSourceWaves(szWave,1))goto Destroy;
//*/
return true;

Destroy:;
Destroy();
MessageBox(NULL,"DirectSound Initialize Error","Sorry.",MB_OK);
return false;
}

///////////////////////////////////////////////////////////////////////////
//
void CDS::Destroy()
{
	if(m_lpDS!=NULL)
	{
	m_lpDS->Release();
	m_lpDS=NULL;
	}
return;
}

//////////////////////////////////////////////////////////////////////////
//
bool  CDS::LoadSourceWave(int nBufferIndex,LPCSTR szSourceWave)
{
HRESULT hr;
CWave wave;

if(nBufferIndex>=DSOUND_MAX_NUM)return false;

//(1)Initialize wave
wave.Create(szSourceWave);

//(2)Get the wave information
DWORD         dwDataLen=wave.GetDataLen();
WAVEFORMATEX  wfFormat;
wave.GetFormat(wfFormat);

//(3)Setup the DS buffer description
DSBUFFERDESC  dsbdDesc;
ZeroMemory(&dsbdDesc, sizeof(DSBUFFERDESC));
dsbdDesc.dwSize =sizeof(DSBUFFERDESC);
dsbdDesc.dwFlags=DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN |
					DSBCAPS_CTRLVOLUME | DSBCAPS_STATIC;
dsbdDesc.dwBufferBytes=dwDataLen;
dsbdDesc.lpwfxFormat  =&wfFormat;

//(4)Create the DS buffer
hr=m_lpDS->CreateSoundBuffer(&dsbdDesc,
                             &(m_lpDSB[nBufferIndex]), 
							 NULL);
if(hr!=DS_OK)return false;

//(5)Lock the DS buffer
BYTE* pDSBuffData;
hr=m_lpDSB[nBufferIndex]->Lock(0,dwDataLen,
							   (void**)&pDSBuffData,
							   &dwDataLen,NULL,0,0);
if(hr!=DS_OK)return false;

		  
//(6)Write wave data to the DS buffer
dwDataLen=wave.GetData(pDSBuffData,dwDataLen);

//(7)Unlock the DS buffer
hr=m_lpDSB[nBufferIndex]->Unlock(pDSBuffData, 
								 dwDataLen, 
								 NULL, 0);
if(hr!=DS_OK)return false;

return true;
}


//////////////////////////////////////////////////////////////////////////////
//
bool CDS::ReLoadSourceWaves(LPCSTR szSourceWave[DSOUND_MAX_NUM],int nSoundNum)
{
if(nSoundNum>DSOUND_MAX_NUM)return false;
m_nSoundNum=nSoundNum;
	
	for(int i=0;i<m_nSoundNum;i++)
	{
	//if(m_lpDSB[i]!=NULL)Stop(i);
		if(m_lpDSB[i]!=NULL)m_lpDSB[i]->Release();
	m_szSourceWave[i]=szSourceWave[i];
	//if(!LoadSourceWave(i,m_szSourceWave[i]))return false;
	if(!RestoreBuffer(i))return false;
	}

return true;
}
///////////////////////////////////////////////////////////////////////
//
bool CDS::Play(int nBufferIndex,unsigned long luType,long lVolume,long lFrequency,long lPan)
{
DWORD dwStatus;
m_lpDSB[nBufferIndex]->GetStatus(&dwStatus);

	if(dwStatus & DSBSTATUS_BUFFERLOST)
    RestoreBuffer(nBufferIndex);
	
	//if(!(dwStatus & DSBSTATUS_PLAYING))
	{
    m_lpDSB[nBufferIndex]->SetVolume(lVolume);
    m_lpDSB[nBufferIndex]->SetPan(lPan);
	m_lpDSB[nBufferIndex]->SetFrequency(lFrequency);
	
	m_lpDSB[nBufferIndex]->Play(0,0,luType);
	}
return true;
}
/*
   if (dwStatus & DSBSTATUS_LOOPING)
        lpDSBSounds[8]->Stop();
 
*/
///////////////////////////////////////////////////////////////////////////
//
bool CDS::Stop(int nBufferIndex)
{
DWORD dwStatus;
m_lpDSB[nBufferIndex]->GetStatus(&dwStatus);

	if(dwStatus & DSBSTATUS_BUFFERLOST)
    RestoreBuffer(nBufferIndex);
	
	if((dwStatus & DSBSTATUS_PLAYING & DSBSTATUS_LOOPING))
	m_lpDSB[nBufferIndex]->Stop();

return true;
}
//////////////////////////////////////////////////////////////////
//
bool CDS::RestoreBuffer(int nBufferIndex)
{
if(m_lpDSB[nBufferIndex]!=DS_OK)
return false;

return LoadSourceWave(nBufferIndex,
					  m_szSourceWave[nBufferIndex]);
}

⌨️ 快捷键说明

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