游戏音乐与音效的播放

Python实现游戏中的音乐音效制作音频处理 最后,我们使用pygame.sndarray.make_sound()方法创建一个新的音效对象,并使用filtered_sound.play()方法播放新的音效。最后,我们使用pygame.sndarray.make_sound()方法创建一个新的音效对象,并使用noisy_sound.play()方法播放新的音效。在本文中,我们将了解Python在游戏音乐音效制作中的应用,包括如何创建和播放音乐,如何添音效,以及如何应用音频处理技术来增强游戏音效。最后,我们使用sound.play()方法播放音效 阅读详情
2000年11月29日 13:20:00

Win32环境下,播放音乐音效的方法太多了,而且有一个共同点就是:你不需要花很大的心力就可以得到你需要的东西。延续主题式的探讨,这一期我们着重在音乐与音效的播放。

游戏的配乐

我相信很多人一定同意音乐在游戏里面所占的地位,回想一下国内RPG的经典「仙剑奇侠传」,剥掉音乐这一个层面,整个游戏将会逊色不少,尤其适当的场景搭配适当的音乐,更能让玩家融入剧情当中。该哭的时候哭,该笑的时候笑,大概就很切中要领了。RPG剩下的音效部份,并不特别突出,大抵上知道砍人的时候有挥剑的声音就可以了,所以在音效的表现方面,通常比较不那麽注重。而即时战斗的游戏着重在厮杀的音效表现上,一大片人马,一片混杂的声音,这其中牵涉到混音的部份,我们底下也会探讨到。读完这篇文章,你会学习到什麽时候该用什麽样的程式作法来表现游戏的另一个生命:音乐与音效。

MIDI开始

早期DOS下的音乐部份,大多数采用声霸卡的规格,副档名为CMF者便是这种格式,当然游戏通常不会让你看到真正的作法,但是内部采用这种格式居多是无庸置疑的。而WINDOW下的游戏以光碟发行者居多,为了充分达到空间利用的阶段,游戏中会大量使用WAV格式的档案,或是直接将音乐烧成音轨的格式。尤其很多游戏喜欢采用第一片资料片,第二片音乐片的作法,平常不玩游戏还可以当成音乐CD来听,算是满有质感的一件事。当然,我的意思是这些音乐必须要声声入耳,如果音乐本身庸庸碌碌的,即使烧成音轨,一样是庸庸碌碌,改变不了这个事实。

WINDOW下,考量到空间的大小,MIDI格式的音乐档绝对是最佳的选择,一首五分钟的MIDI了不起十万字元的大小,这跟WAV格式一分钟占用量以MB计,简直是小巫见大巫,所以网站上的音乐,游戏的音乐,都很适合用MIDI来表现,而音乐部份我个人注重旋律,至於一首音乐本身使用到的乐器数量,我倒是很少去注意,人的耳朵听东西有一定的极限,只要不产生杂音,配合优美的旋律,大致上都可以接受。

播放MIDI的程式作法

游戏中播放音乐的要点就是循环播放,也就是播放完毕以後,要让他从头开始播放,直到场景更换,或是游戏结束为止。所以当MIDI档案播放完毕以後,必须要能通知程式,让程式做出适当的处理。播放MIDI的作法只要藉由WINDOW的多媒体的支援,马上就搞定了,甚至直接从HELP的作法剪过来,稍微修改一下,也能符合需要,因为这种东西相当公式化,A君和B君写出来的程式码也大致上会长得差不多,废话不多说,看看程式多麽简单便是:

class CMidi

{

public:

DWORD Play(HWND,char* FileName);

void Replay();

void Stop();

private:

UINT wDeviceID;//MCI装置代号

DWORD dwReturn;

MCI_OPEN_PARMS mciOpenParms;

MCI_PLAY_PARMS mciPlayParms;

MCI_STATUS_PARMS mciStatusParms;

MCI_SEQ_SET_PARMS mciSeqSetParms;

};

将他包装成一个类别来使用也可以,而介面的部份需要单纯化,从直觉上来说,第一个动作就是播放(Play),接着是重播(Replay),最後当然是善後的工作了(Stop),不多不少,刚好三个,当然你会想到,是不是需要一个暂停的介面,没问题,这不是什麽难事,花额外的三分钟应该可以胜任愉快。

了解类别大致上的长相以後,让我们来看看实作的部份是怎麽一回事,先从CMidi::Play()开始:

DWORD CMidi::Play(HWND hwnd,char* MidiFile)

{

// 开启Midi的硬体装置,我们使用一般内定值

mciOpenParms.lpstrDeviceType = "sequencer";

//这个叁数就是要播放的MIDI档案名称

mciOpenParms.lpstrElementName = MidiFile;

// 使用Message的方式来播放MIDI而不是STRING的方式

if (dwReturn = mciSendCommand(NULL, MCI_OPEN,

MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,

(DWORD)(LPVOID) &mciOpenParms)

return (dwReturn);

// The device opened successfully; 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) hwnd;

if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,

(DWORD)(LPVOID) &mciPlayParms))

{

mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

return (dwReturn);

}

return (0L);

};

播放MIDI的方式有两种,第一种是利用字串命令硬体动作,第二种是传递讯息的方式,我们采用第二种,原因很清楚了,必须透过讯息的传递,我们才能得知音乐是否播放完毕了。

接下来我们看看Cmidi::Replay是怎麽一回事:

void CMidi::Replay()

{

mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);

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物件给程式,只要在全域的地方下条指令 CMidi midi;即可,尔後midi就是真实的物件了。在场景初始化的部份呼叫midi.Play(hwnd,"ff3celes.mid");,输入正确的MIDI档名即可。此处我播放的是太空战士三代的音乐,只是示范一下,当然这首音乐确实很棒就是了。而在讯息回圈里面,我们必须定义一个讯息:

case MM_MCINOTIFY:

midi.Replay();

break;

在音乐播放完毕以後,我们的讯息回圈会收到MM_MCINOTIFY这个讯息,这时候如同我们前面所言,呼叫Cmidi::Replay()即可。而当场景更换,要重新一首新的音乐,或是程式结束的时候,就是呼叫Cmidi::Stop()的时机。因为一个场景同时间只会存在一首音乐,所以我们的类别表现良好,不用担心。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3176


各种游戏按钮音效素材 里面有制作游戏的各种按钮音效资源,供游戏开发者使用,是游戏可以有更好的体验 立即下载

相关推荐

音效素材(游戏音效,动画音效

音效素材(游戏音效,动画音效);供大家学习

怎么在c语言小游戏里插入音乐,如何在C++编的小游戏中添背景音乐???

满意答案kxapdcaj52014.02.10采纳率:47%等级:11已帮助:16342人1:功能差劲的Playsound函数事例代码如下#include#include#pragma comment(lib,"WinMM.Lib")void main(){PlaySound("c:\\dui12.wav",NULL,SND_FILENAME|SND_ASYNC);}2:功能和Playso...

weixin_26704349的博客 4648

用java编的一个放背景音乐的小程序

用java写的一个可以放背景音乐的小程序,可以添到你原有的java代码中,带来趣味性的效果,不过音乐格式必须是wav

easyx的使用(5)

播放音乐

qq_62582966的博客 964

c++播放音频( c++ play audio),为C++应用程序添启动音效

c++播放音频 clion clion 添link -Winmm.lib clion undefined reference to `__imp_PlaySoundA' 播放出来的声音是 叮咚,不是我的音频 我的天 Instead of using relative path Use an absolute path 可以了 1、CMAKE cmake_minimum_required(VERSION...

Kp0fS的草稿纸 2899

游戏音效是用什么软件制作的?

众多周知,游戏音效能提升游戏的打击感,让游戏更真实,游戏音效是玩家互动和反馈的重要途径,一般是通过拟音、贴库、合成器、效果器处理以及音频引擎实现等技术来创作。那么制作游戏音效是用什么软件呢? 制作游戏音效的软件,常用的 Nuendo, cubase pro, protools,FLStudio, logic pro等DAW软件。 DAW软件可以理解成专为创作...

2693

游戏音乐音效播放 (转)

游戏音乐音效播放 (转)[@more@] 在win32环境下,播放音乐音效的方法太多了,而且有一个共同点就是:你不需要花很大的心力就可以得到你需要的东西。延续主题式的探讨,这一期我们着重在音乐音效播放。 □ 游戏的...

csd3176的博客 117

Android游戏开发基础part8--游戏音乐音效

Android游戏开发基础part8--游戏音乐音效 在我印象中一款出色的游戏都会有精彩的背景音乐音效的,PC游戏中,我玩过的鬼泣就是我认为比较不错的游戏,手机游戏,由于自己手机的档次不够高,玩过的游戏也不多,我最期待的极品飞车14没能玩到,好像说不适屏吧,我的手机才3.1寸,在触屏智能手机横行的年代,3.1寸算不上大的了,换做几年前还勉强可以。 在Android中,常用于播放游戏背景...

mmdev 267

Unity3D研究院之详解游戏开发音频的播放

游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放还可以分为两种,一种为游戏音乐,另一种为游戏音效。前者适用于较长的音乐,如游戏背景音乐。第二种试用比较短的游戏音乐,如开枪,打怪 时“砰砰”一瞬间播放游戏音效。今天MOMO将用下面的例子带盆友们去剖析Unity3D游戏音乐音效播放。 Unity3D游戏引擎一共支持4个音乐格式的文件 .AIFF  适用于较短的音乐文件可用

sxl_0305 742

游戏音效素材

500来个短声音音效.包你满意.游戏音效.短声音素材.有打斗的也有其他.

一套飞行类游戏音效

一套飞行游戏的音频素材包,包括爆炸音效,背景音乐,提示音

Unity3D 游戏引擎之详解游戏开发音频的播放(十五)

Unity3D 游戏引擎之详解游戏开发音频的播放 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/550 游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放还可以分为两种,一种为游戏音乐,另一种为游戏音效。前者适用于较长的音乐,如游戏背景音乐。第二种试...

mmdev 671

详解游戏开发音频的播放

为什么80%的码农都做不了架构师?>>> ...

weixin_34326179的博客 325
上一篇: 深入了解计算机电源(一)
下一篇: 电子词典中鼠标取词的原理
softart
博客等级 码龄19年 67粉丝 2569原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值