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

📄 mirsound.cpp

📁 好游戏的客户端原码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MirSound.cpp: implementation of the CMirSound class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"

#define MAX_KINDS_OF_WAVE	50
//#define MAX_DUPLE_COUNT		5
#define MAX_LIM_TIME		60000


#define MAX_MP3_WAR			-1000
#define MAX_MP3_PEACE		-100

#define _PI					3.1415927

#define MAKEPOS(a1,a2,a3)	{a1.x = a2;a1.y = a3;}

void CALLBACK AmbianceTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
void CALLBACK FadeInTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
void CALLBACK FadeOutTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////
//  Name		:	CMirSound
//  Destination :	Constructor
//
//  Parameter	:	none
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
CMirSound::CMirSound()
{
	m_ppWavList = NULL;
	m_pWavListHeader = NULL;
	m_ppBuffer = NULL;
	m_3DEnable = FALSE;
	m_bPlay = TRUE;
	m_bBGMPlay = TRUE;	// 烙矫
	ReadWavFileList("SoundList.wwl");
	m_ppBuffer = new CSBuffer*[MAX_KINDS_OF_WAVE];
	for(int i = 0 ; i < MAX_KINDS_OF_WAVE ; i++)
	{
		m_ppBuffer[i] = new CSBuffer;
	}

	m_pMp3 = new CBMMp3;

	m_lWavMaxVol = -100;
	m_lMp3MaxVol = -1000;
	m_nUseCount = 0;
	m_bRunningTimer = FALSE;
	m_bIsWarMode = FALSE;
}


///////////////////////////////////////////////////////////////////////
//  Name		:	~CMirSound
//  Destination :	Destructor
//
//  Parameter	:	none
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
CMirSound::~CMirSound()
{
	unsigned int i;

	if(m_ppWavList != NULL)
	{
		for(i=0;i<m_pWavListHeader->FieldCount;i++)
		{
			delete m_ppWavList[i];
		}
	delete[] m_ppWavList;
	}

	if(m_bAmbiance)
	{
		KillTimer(g_xMainWnd.GetSafehWnd(),ID_AMBIANCE_TIMER);
		for(i = 0 ; i < MAX_AMBIANCE_COUNT ; i++)
		{
			m_pAmbianceBuffer[i]->Release();
			delete m_pAmbianceBuffer[i];
		}
	}
	m_CommonWavBuffer.Release();

	if(m_ppBuffer!=NULL)
	{
		for(int j =0;j<m_nUseCount;j++)			// Buffer Class
		{
			m_ppBuffer[j]->Release();
			delete m_ppBuffer[j];
		}
		delete[] m_ppBuffer;
	}

	if(m_pWavListHeader != NULL)	delete m_pWavListHeader;
	if(m_pMp3!=NULL) delete m_pMp3;
	if(m_pSound!=NULL)		delete m_pSound;	// Sound Class 
}


///////////////////////////////////////////////////////////////////////
//  Name		:	CalsDistance
//  Destination :	Calculate Distance from User to Sound Source
//
//  Parameter	:	Position  Src
//					Position Chr
//
//	Return Value:	int Distance
//  Update		:
///////////////////////////////////////////////////////////////////////
float CMirSound::CalsDistanceX(POINT Src,POINT Chr)		// 家府 惯积 困摹客 泅犁 纳腐磐埃狼 芭府 炼荤
{
	float l_Result;
	l_Result = (float)((Chr.x - Src.x)%13);						// 芭府绰 12 捞惑老荐 绝促.
	l_Result = (float)(1.0-(float)sqrt(1.0 - l_Result/(float)12.0))*((float)-1.0);
	return l_Result;
}

float CMirSound::CalsDistanceY(POINT Src,POINT Chr)		// 家府 惯积 困摹客 泅犁 纳腐磐埃狼 芭府 炼荤
{
	float l_Result;
	l_Result = (float)((Chr.y- Src.y)%13);						// 芭府绰 12 捞惑老荐 绝促.
	l_Result =float(1.0-(float)sqrt(1.0 - (double)(l_Result)/12.0))*((float)-1.0);
	return l_Result;
}

INT CMirSound::CalsDistance(POINT Src,POINT Chr)
{
	INT Cx,Cy;
	INT nResult;
	Cx = Src.x - Chr.x;
	Cy = Src.y - Chr.y;
	Cx = Cx<0 ? Cx*(-1) : Cx;
	Cy = Cy<0 ? Cy*(-1) : Cy;
	
	nResult = Cx >Cy ? Cx : Cy;
	return nResult;
}


///////////////////////////////////////////////////////////////////////
//  Name		:	CalsPan
//  Destination :	Calculate Pans value
//
//  Parameter	:	int Direction
//					int Distance
//
//	Return Value:	int Pans
//  Update		:
///////////////////////////////////////////////////////////////////////
int CMirSound::CalsPan(int Dir,int Dis)	
{
	int pans;
	pans = Dir*(int)(5000.0*(sin(_PI*(Dis/26.0))));

	return pans;				
}


///////////////////////////////////////////////////////////////////////
//  Name		:
//  Destination :
//
//  Parameter	:
//
//
//	Return Value:
//  Update		:
///////////////////////////////////////////////////////////////////////
int CMirSound::CalsVolume(int Dis) // 荐沥 夸噶
{
	int l_Result;
	if(Dis!=0)
	{
		l_Result = (int)((cos(_PI*(Dis/26.0)))*100);
		l_Result = (101 - l_Result);		// 弥措 杭冯 0 弥家 杭俘 (-1)*x : 泅力狼 100-(x)%
		l_Result = m_lWavMaxVol+l_Result*(-20);			// 弥家澜樊 -2000 ~ 弥措澜樊 0
		return l_Result;
	}
	else
	{
		return m_lWavMaxVol;							// 般媚 廉 乐芭唱 夯牢狼 家府	弥措 澜樊栏肺
	}
}


///////////////////////////////////////////////////////////////////////
//  Name		:
//  Destination :
//
//  Parameter	:
//
//
//	Return Value:
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::ReadWavFileList(char* fName)
{
	unsigned int i;
	int Count;
	DWORD dwReadSize;
	DWORD	dwError;
	WAVELIST* l_WavList;

	HANDLE hFile = ::CreateFile(fName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

	dwError = GetLastError();
	if(dwError==ERROR_SUCCESS)
	{
		//	Header Reading
		m_pWavListHeader = new WAVELISTHEADER;

		ReadFile(hFile,m_pWavListHeader,sizeof(WAVELISTHEADER),&dwReadSize,NULL);
		//	fclose(hFile);	
		m_ppWavList = new WAVELIST*[m_pWavListHeader->FieldCount];

		// List Reading
		Count = 0;
		for(i=0;i<m_pWavListHeader->ListCount ; i++)
		{
			l_WavList = new WAVELIST;
			ZeroMemory(l_WavList,sizeof(WAVELIST));
			ReadFile(hFile,l_WavList,sizeof(WAVELIST),&dwReadSize,NULL);

			if(l_WavList->ID != 0) 
			{
				for(unsigned int j=0; j<strlen(l_WavList->Des);j++)
				{
					char	temp[4];
					int		cmpResult;
					strncpy(temp,l_WavList->Des+j,3);
					temp[3] = NULL;
					cmpResult = strcmp(temp,"wav");
					if(cmpResult==0)
					{
						*(l_WavList->Des+j+3)=NULL;
					}
				}
				l_WavList->Des;
				m_ppWavList[Count] = l_WavList;
				Count++;
			}
			else
			{
				delete l_WavList;
			}
		}
		CloseHandle(hFile);
	}
	else
	{
		m_bPlay = FALSE;
	}
}


///////////////////////////////////////////////////////////////////////
//  Name		:
//  Destination :
//
//  Parameter	:
//
//
//	Return Value:
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::PlayMagicEffect(POINT Target, POINT Chr, int Wavnum)
{
	if(m_bPlay)
	{
		FreeNotUseBuffer();
	}
}


///////////////////////////////////////////////////////////////////////
//  Name		:	
//  Destination :	
//
//  Parameter	:	
//
//	Return Value:	
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::PlayAmbianceWav(int WavNum)
{
	if(m_bAmbiance)
	{
		FreeNotUseBuffer();
		m_pAmbianceBuffer[WavNum]->SetVolume(m_lWavMaxVol);
		m_pAmbianceBuffer[WavNum]->Play(0);
	}
}


///////////////////////////////////////////////////////////////////////
//  Name		:	PlayBkMusic
//  Destination :	Play Wave File with stream
//
//  Parameter	:	bool	looped
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::PlayBkMusicMp3(BOOL Looped,INT	nIndex)
{
	if(m_bBGMPlay)
	{
		CHAR		szMp3FileName[MAX_PATH];
		ZeroMemory(szMp3FileName,MAX_PATH);
		if(m_pMp3->IsPlaying())
		{
			// Play吝
			m_pMp3->OnStop();
		}
//		FindBGMFileName(nIndex,szMp3FileName);
		strcpy(szMp3FileName,"1.mp3");	// 烙矫
		if(szMp3FileName[0]!=NULL)
		{
			m_pMp3->LoadMp3(szMp3FileName,g_xMainWnd.GetSafehWnd());
			m_pMp3->OnPlay(-5000,Looped);			
			BGMFadeIn();
		}
		else
		{
			
		}
	}
}


///////////////////////////////////////////////////////////////////////
//  Name		:	StopBkMusic
//  Destination :	Stop play BackGround Sound
//
//  Parameter	:	none
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::StopBkMusicMp3(void)
{
	BGMFadeOut();
}
///////////////////////////////////////////////////////////////////////
//  Name		:	PlayActorWav
//  Destination :	Play Wave File with any effect
//
//  Parameter	:	Position Mon
//					Position Chr
//					int WavNum
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
INT CMirSound::PlayActorWav(INT Sx,INT Sy,INT Dx,INT Dy,int Wavnum,INT lVolume,BOOL bLooping)
{
	CSBuffer*	pBuffer;
	char* fname;
	POINT	Mon,Chr;
	INT Dis;
	INT Dir;
	MAKEPOS(Mon,Sx,Sy);
	MAKEPOS(Chr,Dx,Sy);
 	if(m_bPlay)
	{
		FreeNotUseBuffer();
		fname = SeekFileName(Wavnum);
		if(fname != NULL)
		{
			pBuffer= FindBuffer(Wavnum,TRUE);
			if(pBuffer!=NULL)
			{
				if(m_3DEnable)
				{
						pBuffer->PlayExtended((float)CalsDistanceX(Mon,Chr),(float)CalsDistanceY(Mon,Chr),(float)0.1,0);	// 3D pan
				}
				else
				{
					Dis = CalsDistance(Mon,Chr);
					Dir = CalsDirection(Mon,Chr);
					if(bLooping)
					{
						pBuffer->PlayExtended(DSBPLAY_LOOPING,CalsPan(Dir,Dis),CalsVolume(Dis),0);										    // 2D pan
					}
					else
					{
						lVolume = CalsVolume(Dis)*((100-lVolume==0)?1:(100-lVolume)/5);
						pBuffer->PlayExtended(0,CalsPan(Dir,Dis),lVolume,0);										    // 2D pan
					}
					return pBuffer->nBufferIdx;
				}
			}
		}
	}
	return MAX_DUPLE_COUNT;
}


///////////////////////////////////////////////////////////////////////
//  Name		:	StopAllSound
//  Destination :	Stop All playing Sound
//
//  Parameter	:	none
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::StopAllSound(void)
{
	for(int i = 0;i<m_nUseCount;i++)
	{
		m_ppBuffer[i]->Stop();
	}
}

///////////////////////////////////////////////////////////////////////
//  Name		:	StopSound
//  Destination :	Stop play Sound
//
//  Parameter	:	int nNum
//
//	Return Value:	void
//  Update		:
///////////////////////////////////////////////////////////////////////
void CMirSound::StopSound(int nNum)
{
	CSBuffer*	pBuffer;
	pBuffer = NULL;
	pBuffer = FindBuffer(nNum,FALSE);
	if(pBuffer != NULL)
		pBuffer->Stop();
}


void CMirSound::StopSound(int nNum,int BufIdx)
{
	CSBuffer*	pBuffer;
	pBuffer = NULL;
	pBuffer = FindBuffer(nNum,FALSE);
	if(pBuffer != NULL)
		pBuffer->Stop(BufIdx);
}


///////////////////////////////////////////////////////////////////////
//  Name		:	SeekFileName
//  Destination :	Find File name with Wave number
//
//  Parameter	:	int wavnum
//
//	Return Value:	char*
//  Update		:
///////////////////////////////////////////////////////////////////////
char* CMirSound::SeekFileName(int wavnum)
{
	unsigned int i;
	if(m_bPlay)
	{
		for(i=0;i<m_pWavListHeader->FieldCount;i++)
		{
			if(wavnum == m_ppWavList[i]->ID) 
				return m_ppWavList[i]->Des;
		}
	}
	return NULL;
}


///////////////////////////////////////////////////////////////////////
//  Name		:	FindBuffer
//  Destination :	
//
//
//  Parameter	:	
//
//	Return Value:	
//  Update		:
///////////////////////////////////////////////////////////////////////
CSBuffer* CMirSound::FindBuffer(int nNum,BOOL ForLoad)	// 绝阑锭 Load窍绰 巴捞搁 TRUE 酒聪搁 FASLE
{
	if(m_nUseCount>0)
	{
		for(int i=0 ; i<MAX_KINDS_OF_WAVE;i++)
		{
			if(m_ppBuffer[i]->m_ID==nNum)	// 佬绢 初篮 巴甸吝俊 乐衬?
			{
				return m_ppBuffer[i];
			}
			
		}
	}
	// 佬绢 初篮巴吝俊 绝窜富捞衬?
	if(ForLoad)
	{
		if(m_nUseCount<MAX_KINDS_OF_WAVE)
		{
			char* fname;
			// 弊烦 佬磊!
			fname = SeekFileName(nNum);
			if(m_3DEnable) m_ppBuffer[m_nUseCount]->Enable3d();
			if(m_ppBuffer[m_nUseCount]->Load(m_pSound,fname,5)!=E_FAIL)
			{
				m_ppBuffer[m_nUseCount]->m_ID = nNum;
				m_nUseCount++;
				return m_ppBuffer[m_nUseCount-1];
			}
		}
		else
		{	// 卿! 佬阑 傍埃 付历 绝窜 富捞衬?
			// 弊烦 富磊!
			return NULL;
		}
	}
	return NULL;
}



///////////////////////////////////////////////////////////////////////
//  Name		:	
//  Destination :	
//
//  Parameter	:	
//
//	Return Value:	
//  Update		:
///////////////////////////////////////////////////////////////////////
BOOL CMirSound::InitMirSound(HWND hWnd)
{
	if(hWnd != NULL)
	{
		m_hWnd = hWnd;
		m_pSound = new CSound;
		m_pSound->Create(m_hWnd,TRUE);
		return TRUE;
	}
	return FALSE;
}



///////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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