MusicPlace.cpp
上传用户:semy2100
上传日期:2013-01-22
资源大小:3633k
文件大小:5k
源码类别:

射击游戏

开发平台:

Visual C++

  1. /********************************************************************
  2. *                        空运爆发                                    *
  3. *                       Version 2.0                                  *
  4. * 本游戏全部代码由:                                                 *
  5. *                   冲天实验室   梁锋 编写                           *
  6. *                    邮箱:lenwine@126.com                           *
  7. *                bbs: http://free2.e-168.cn/lenwind (正在开发中...)  *
  8. **********************************************************************/
  9. //////////////////////////////////////////////////////////////////////
  10. #include "stdafx.h"
  11. #include "wgame.h"
  12. #include "MusicPlace.h"
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. //设置两个全局变量控制音量
  17. //用于控制背景音乐音量大小
  18. int m_bMusVoLF=DSBVOLUME_MAX;
  19. //用于控制音效音量大小
  20. int m_cMusVoLF=DSBVOLUME_MAX;
  21. MusicPlace::MusicPlace(const char* FileName,BOOL m_bgMusic,LPDIRECTSOUND lpDS,DWORD dwFlags)
  22. {
  23. //判断是否用于背景音乐
  24. //若m_bgMusic为TRUE,则该音乐用于背景音乐
  25. //若m_bgMusic为FALSE,则该音乐用于音效
  26. m_lenbm=m_bgMusic;
  27. //复位声音缓冲区
  28. m_lMusBuf=NULL;
  29. //打开wav文件
  30. FILE* pFile=fopen(FileName,"rb");
  31. if(!pFile)
  32. return;
  33. ////反相关信息读入lenwave
  34. LWaveF lenwave;
  35. if(fread(&lenwave,sizeof(lenwave),1,pFile)!=1)
  36. {
  37. fclose(pFile);
  38. return;
  39. }
  40. //所需的数据区的大小
  41. DWORD dwSize=lenwave.dwDSize;
  42. //是否是一个立体声音文件?
  43. BOOL bStereo=lenwave.wChnls>1?true:false;
  44. //为这个wav文件创建声音文件
  45. if(CreateSoundBuffer(lpDS,dwFlags,dwSize,lenwave.dwSRate,lenwave.BitsPerSample,lenwave.wBlkAlign,bStereo))
  46. {
  47. //从wav 文件中读入声音数据
  48. if(!Access(pFile,dwSize,sizeof(lenwave)))
  49. MessageBox(NULL,"读入声音数据出错",NULL,MB_OK);
  50. }
  51. fclose(pFile);
  52. }
  53. MusicPlace::~MusicPlace()
  54. {
  55.     ActionStop();
  56. if(m_lMusBuf)
  57. {
  58. m_lMusBuf->Release();
  59. }
  60. }
  61. BOOL MusicPlace::CreateSoundBuffer(LPDIRECTSOUND lpDS,DWORD dwFlags,DWORD dwBufSize,DWORD dwFreq,DWORD dwBitsPerSample,DWORD dwBlkAlign,BOOL bStereo)
  62. {
  63. PCMWAVEFORMAT lenwav;
  64. DSBUFFERDESC  lenbuf;
  65. //设置wave format结构
  66. memset(&lenwav,0,sizeof(PCMWAVEFORMAT));
  67. lenwav.wf.wFormatTag      =WAVE_FORMAT_PCM;
  68. lenwav.wf.nChannels       =bStereo?2:1;
  69. lenwav.wf.nSamplesPerSec  =dwFreq;
  70. lenwav.wf.nBlockAlign     =(WORD)dwBlkAlign;
  71. lenwav.wf.nAvgBytesPerSec =lenwav.wf.nSamplesPerSec * lenwav.wf.nBlockAlign;
  72. lenwav.wBitsPerSample     =(WORD)dwBitsPerSample;
  73. //设置DSBUFFERDESC结构
  74. memset(&lenbuf,0,sizeof(DSBUFFERDESC));//Zero it out.
  75. lenbuf.dwSize        =sizeof(DSBUFFERDESC);
  76. lenbuf.dwFlags       =dwFlags;
  77. lenbuf.dwBufferBytes =dwBufSize;
  78. lenbuf.lpwfxFormat   =(LPWAVEFORMATEX)&lenwav;
  79.  
  80. if(DS_OK!=lpDS->CreateSoundBuffer(&lenbuf,&m_lMusBuf,NULL))
  81. {
  82. MessageBox(NULL,"创建声音缓冲区失败",NULL,MB_OK);
  83. return FALSE;
  84. }
  85.    return TRUE;
  86. }
  87. BOOL MusicPlace::Access(FILE *pFile,DWORD dwSize,DWORD dwPos)
  88. {
  89. //定位到文件中的正确位置
  90. if(dwPos!=0xffffffff)
  91. {
  92. if(fseek(pFile,dwPos,SEEK_SET)!=0)
  93. {
  94. return FALSE;
  95. }
  96. }
  97. //锁定缓冲区数据
  98. LPVOID  lBufdatao;
  99. DWORD   dBufdatao;//缓冲区数据大小
  100. LPVOID  lBufdatas;
  101. DWORD   dBufdatas;//缓冲区数据大小
  102. HRESULT rval;
  103. rval=m_lMusBuf->Lock(0,dwSize,&lBufdatao,&dBufdatao,&lBufdatas,&dBufdatas,DSBLOCK_FROMWRITECURSOR);
  104. if(rval!=DS_OK)
  105. {
  106. return FALSE;
  107. }
  108. //读取数据
  109. if(dBufdatao>0)
  110. {
  111. if(fread(lBufdatao,dBufdatao,1,pFile)!=1)
  112. {
  113. return FALSE;
  114. }
  115. }
  116. if(dBufdatas>0)
  117. {
  118. if(fread(lBufdatas,dBufdatas,1,pFile)!=1)
  119. {
  120. return FALSE;
  121. }
  122. }
  123. //解除锁定
  124. rval=m_lMusBuf->Unlock(lBufdatao,dBufdatao,lBufdatas,dBufdatas);
  125. if(rval!=DS_OK)
  126. {
  127. return FALSE;
  128. }
  129. return TRUE;
  130. }
  131. //入口参数:bContinue控制调用ActionStop后是否接着原来的播放点播放
  132. //bContinue为TRUE时为接着原来点播放,为FALSE时从头播放
  133. //默认bContinue为FALSE
  134. BOOL MusicPlace::ActionPlay(BOOL bContinue)
  135. {
  136. if(m_lMusBuf)//确认声音缓冲区有效
  137. {
  138. DWORD dwStatus;
  139. if(DS_OK!=m_lMusBuf->GetStatus(&dwStatus))
  140. {
  141. MessageBox(NULL,"获取DirectSound缓冲区状态失败!",NULL,MB_OK);
  142. return FALSE;
  143. }
  144. if((dwStatus&DSBSTATUS_PLAYING)!=DSBSTATUS_PLAYING)
  145. {
  146. if(m_lenbm)//是背景音乐则循环播放
  147. {
  148. //设置播放位置
  149. if(!bContinue)
  150. m_lMusBuf->SetCurrentPosition(0);
  151. if(DS_OK!=m_lMusBuf->Play(0,0,DSBPLAY_LOOPING))//Play the sound
  152. {
  153. return FALSE;
  154. }
  155. }
  156. else
  157. //设置播放位置
  158. {
  159. if(!bContinue)
  160. m_lMusBuf->SetCurrentPosition(0);
  161. if(DS_OK!=m_lMusBuf->Play(0,0,0))//Play the sound
  162. {
  163. MessageBox(NULL,"不能播放声音缓冲区对象",NULL,MB_OK);
  164. }
  165. }
  166. }
  167. }
  168. return TRUE;
  169. }
  170. BOOL MusicPlace::ActionStop()
  171. {
  172. if(m_lMusBuf)//确认声音缓冲区有效
  173. {
  174. DWORD dwStatus;
  175. if(DS_OK!=m_lMusBuf->GetStatus(&dwStatus))
  176. {
  177. return FALSE;
  178. }
  179. if((dwStatus&DSBSTATUS_PLAYING)==DSBSTATUS_PLAYING)
  180. {
  181. if(DS_OK!=m_lMusBuf->Stop())//Stop the sound
  182. {
  183. return FALSE;
  184. }
  185. }
  186. }
  187. return TRUE;
  188. }
  189. BOOL MusicPlace::bTrue()
  190. {
  191. if(m_lMusBuf)
  192. return TRUE;
  193. else
  194. return FALSE;
  195. }
  196. //----------音量控制部分----------
  197. //SetVolume:设置音量
  198. //入口参数为百分数(0-100)
  199. //以后如果再需要用于控制音量部分就要再加函数。暂时设定一值
  200. void MusicPlace::CtrlVolume(int vol)
  201. {
  202. int cVol;
  203. if(vol<=0)
  204. cVol=DSBVOLUME_MIN;
  205. else if(vol>=100)
  206. cVol=DSBVOLUME_MAX;
  207. else
  208. cVol=DSBVOLUME_MIN+(DSBVOLUME_MAX-DSBVOLUME_MIN)/vol;
  209. //GetBuffer()->SetVolume();
  210. }