📄 mirsound.cpp
字号:
// 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 + -