在玩幸运糖果屋357的时候总有另一个游戏的音效声音为什么

游戏音乐与音效的播放 -
游戏音乐与音效的播放
文档内容:
在Win32环境下,播放音乐音效的方法太多了,而且有一个共同点就是:你不需要花很大的心力就可以得到你需要的东西。延续主题式的探讨,这一期我们着重在音乐与音效的播放。
我相信很多人一定同意音乐在游戏里面所占的地位,回想一下国内RPG的经典「仙剑奇侠传」,剥掉音乐这一个层面,整个游戏将会逊色不少,尤其适当的场景搭配适当的音乐,更能让玩家融入剧情当中。该哭的时候哭,该笑的时候笑,大概就很切中要领了。RPG剩下的音效部份,并不特别突出,大抵上知道砍人的时候有挥剑的声音就可以了,所以在音效的表现方面,通常比较不那麽注重。而即时战斗的游戏着重在厮杀的音效表现上,一大片人马,一片混杂的声音,这其中牵涉到混音的部份,我们底下也会探讨到。读完这篇文章,你会学习到什麽时候该用什麽样的程式作法来表现游戏的另一个生命:音乐与音效。
早期DOS下的音乐部份,大多数采用声霸卡的规格,副档名为CMF者便是这种格式,当然游戏通常不会让你看到真正的作法,但是内部采用这种格式居多是无庸置疑的。而WINDOW下的游戏以光碟发行者居多,为了充分达到空间利用的阶段,游戏中会大量使用WAV格式的档案,或是直接将音乐烧成音轨的格式。尤其很多游戏喜欢采用第一片资料片,第二片音乐片的作法,平常不玩游戏还可以当成音乐CD来听,算是满有质感的一件事。当然,我的意思是这些音乐必须要声声入耳,如果音乐本身庸庸碌碌的,即使烧成音轨,一样是庸庸碌碌,改变不了这个事实。
在WINDOW下,考量到空间的大小,MIDI格式的音乐档绝对是最佳的选择,一首五分钟的MIDI了不起十万字元的大小,这跟WAV格式一分钟占用量以MB计,简直是小巫见大巫,所以网站上的音乐,游戏的音乐,都很适合用MIDI来表现,而音乐部份我个人注重旋律,至於一首音乐本身使用到的乐器数量,我倒是很少去注意,人的耳朵听东西有一定的极限,只要不产生杂音,配合优美的旋律,大致上都可以接受。
游戏中播放音乐的要点就是循环播放,也就是播放完毕以後,要让他从头开始播放,直到场景更换,或是游戏结束为止。所以当MIDI档案播放完毕以後,必须要能通知程式,让程式做出适当的处理。播放MIDI的作法只要藉由WINDOW的多媒体的支援,马上就搞定了,甚至直接从HELP的作法剪过来,稍微修改一下,也能符合需要,因为这种东西相当公式化,A君和B君写出来的程式码也大致上会长得差不多,废话不多说,看看程式多麽简单便是:
DWORD Play(HWND,char* FileName);
void Replay();
void Stop();
UINT wDeviceID;//MCI装置代号
MCI_OPEN_PARMS mciOpenP
MCI_PLAY_PARMS mciPlayP
MCI_STATUS_PARMS mciStatusP
MCI_SEQ_SET_PARMS mciSeqSetP
将他包装成一个类别来使用也可以,而介面的部份需要单纯化,从直觉上来说,第一个动作就是播放(Play),接着是重播(Replay),最後当然是善後的工作了(Stop),不多不少,刚好三个,当然你会想到,是不是需要一个暂停的介面,没问题,这不是什麽难事,花额外的三分钟应该可以胜任愉快。
了解类别大致上的长相以後,让我们来看看实作的部份是怎麽一回事,先从CMidi::Play()开始:
CMidi::Play(HWND hwnd,char* MidiFile)
// 开启Midi的硬体装置,我们使用一般内定值
mciOpenParms.lpstrDeviceType = &sequencer&;
//这个叁数就是要播放的MIDI档案名称
mciOpenParms.lpstrElementName = MidiF
// 使用Message的方式来播放MIDI而不是STRING的方式
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &mciOpenParms)
return (dwReturn);
// The device get the device ID.
wDeviceID = mciOpenParms.wDeviceID;
// Check if the output port is the MIDI mapper.
mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
&&&&&&&&&&&
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
&&&&&&&&&&&
return (dwReturn);
// 为了达成重复播放的目的,必须让我们的程式能够接收到
// MM_MCINOTIFY的讯息,这个函示呼叫的方式,就是传递
// WM_PLAY讯息给装置,叫他开始播放。
mciPlayParms.dwCallback = (DWORD)
if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY,
MCI_NOTIFY,
(DWORD)(LPVOID) &mciPlayParms))
&&&&&&&&&&&
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
&&&&&&&&&&&
return (dwReturn);
return (0L);
播放MIDI的方式有两种,第一种是利用字串命令硬体动作,第二种是传递讯息的方式,我们采用第二种,原因很清楚了,必须透过讯息的传递,我们才能得知音乐是否播放完毕了。
接下来我们看看Cmidi::Replay是怎麽一回事:
CMidi::Replay()
mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START,
mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,
(DWORD)(LPVOID) &mciPlayParms);
真是不可思议地简单呀,函示里面只包含两条呼叫,第一条呼叫送讯息给装置,叫他把MIDI的播放指标移到最开头的部份,也就是MCI_SEEK_TO_START,
作法就像移动档案指标一样。接着第二条指令光看也明白,就是叫他继续播放就是了,而且别忘了MCI_NOTIFY,当下次播放完毕,还是得用讯息通知我们的程式。
最後看一下Cmidi::Stop()的作法:
void CMidi::Stop()
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
越来越单纯了,里面只有包含一个函示呼叫,其中的讯息叁数MCI_CLOSE,就是结束整个音乐的播放。当你结束播放以後,要播放另一首音乐,很简单,再次呼叫Cmidi::Play()即可。
整个类别的使用方法大致上是这样的:首先配置一个实际的CMidi物件给程式,只要在全域的地方下条指令
CM即可,尔後midi就是真实的物件了。在场景初始化的部份呼叫midi.Play(hwnd,&ff3celes.mid&);,输入正确的MIDI档名即可。此处我播放的是太空战士三代的音乐,只是示范一下,当然这首音乐确实很棒就是了。而在讯息回圈里面,我们必须定义一个讯息:
MM_MCINOTIFY:
midi.Replay();
在音乐播放完毕以後,我们的讯息回圈会收到MM_MCINOTIFY这个讯息,这时候如同我们前面所言,呼叫Cmidi::Replay()即可。而当场景更换,要重新一首新的音乐,或是程式结束的时候,就是呼叫Cmidi::Stop()的时机。因为一个场景同时间只会存在一首音乐,所以我们的类别表现良好,不用担心。
本站中所有文章以及图形均为作者本人、公司所有,本站所有资讯仅供参考,若有任何损失本站概不负责,请自行斟酌。
All Rights reserved.
This site is optimized for at least
resolution (hi-color) viewing
with a browser that supports style sheets.幸运糖果屋_幸运糖果屋游戏在线玩_幸运糖果屋小游戏无敌版幸运糖果屋||||||操作:鼠标点击进行连连看。幸运糖果屋游戏其他版本玩过幸运糖果屋的还玩过热门游戏专题推荐:操作说明:鼠标点击进行连连看。如何开始:点击【PLAY】--【English】开始游戏。游戏介绍:幸运糖果屋是TX开发的一款可爱的小游戏,以缤纷的糖果味主题,喜欢的赶紧来玩玩吧~类型:&&标签:&&大小:1.5KB游戏目标:通过操作将所有棒棒糖连接消除。游戏评论: 19:56:04973河北省邯郸市玩家好玩呦1061231044771035601005381002721001801307782456157游戏音效就是我们在玩游戏时出现的音乐,这个也是每个游戏必备的一部分,但有是你做游戏的背景音乐有间断的感觉的话,我们可以用 getCurrentPosition()这个方法来判断一下声音播放的偏移。其实这个也是非常简单的。只要我们在代码当中设置好(初始化声音)和(加载音效资源)就可以了,别的就和音乐播放器的代码差不多,像开始,停止。不多说了,我们还是先来看看代码当中是怎么实现音效的吧:
[代码] [Java]代码
01//音效的音量
02  intstreamV
04  //定义SoundPool对象
05  privateSoundPoolsoundP
07  //定义HASH表
08  privateHashMapsoundPoolM
10  /***************************************************************
11  *Function:initSounds();
12  *Parameters:null
13  *Returns:None.
14  *Description:初始化声音系统
15  *Notes:none.
16  ***************************************************************/
17  publicvoidinitSounds(){
18  //初始化soundPool对象,第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质
19  soundPool=newSoundPool(100,AudioManager.STREAM_MUSIC,100);
21  //初始化HASH表
22  soundPoolMap=newHashMap();
24  //获得声音设备和设备音量
25  AudioManagermgr=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
26  streamVolume=mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
29  /***************************************************************
30  *Function:loadSfx();
31  *Parameters:null
32  *Returns:None.
33  *Description:加载音效资源
34  *Notes:none.
35  ***************************************************************/
36  publicvoidloadSfx(intraw,intID){
37  //把资源中的音效加载到指定的ID(播放的时候就对应到这个ID播放就行了)
38  soundPoolMap.put(ID,soundPool.load(context,raw,ID));
41  /***************************************************************
42  *Function:play();
43  *Parameters:sound:要播放的音效的ID,loop:循环次数
44  *Returns:None.
45  *Description:播放声音
46  *Notes:none.
47  ***************************************************************/
48  publicvoidplay(intsound,intuLoop){
49  soundPool.play(soundPoolMap.get(sound),streamVolume,streamVolume,1,uLoop,1f);
阅读(...) 评论()【图文】第九章游戏音效处理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第九章游戏音效处理
上传于||文档简介
&&游​戏​编​译​资​料
大小:68.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 幸运糖果屋游戏 的文章

 

随机推荐