游戏音乐与音效的播放 (转)

游戏音乐与音效的播放 (转)[@more@]

 

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:

装置代号

  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);

  }

为了达成重复播放的目的,必须让我们的程式能够接收到

的讯息,这个函示呼叫的方式,就是传递

讯息给装置,叫他开始播放。

  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()的时机。因为一个场景同时间只会存在一首音乐,所以我们的类别表现良好,不用担心。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-987297/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-987297/

【Unity2D 2022:Audio】添加游戏音乐音效 1. 创建空的游戏物体,名为BackgroundMusic2. 为音频播放器添加音频源(Audio Source)组件3. 将背景音乐音频赋值到AudioClip(红色)4. 设置循环播放(蓝色) 阅读详情

相关推荐

消灭星星游戏程序设计【连载三】——游戏音乐播放

前一段时间呢,我用VC做了一个消灭星星的一个小游戏。最近正好有时间,就准备发一个关于消灭星星的游戏设计思路,帮着大家梳理一下怎样用C++去开发一个小的游戏,能够根据自己的想法去把有些游戏的内容实现出来,特别是帮助一些游戏编程感兴趣的朋友,更快的上手C++编写游戏

zhooyu的博客 1063

PSP游戏音乐提取工具.

游戏iso镜像中的at3音乐文件,保证游戏音质

爆炸音效游戏音乐合集:打造沉浸式游戏体验

WAV音频格式,即波形音频格式(Waveform Audio File Format),是微软IBM联合开发的一种标准数字音频文件格式。它是最早期的音频文件格式之一,并且直到今天,WAV格式依然广泛应用于专业音频制作领域,主要是由于以下几个特性:无损质量:WAV格式是未经压缩的音频文件,这意味着它在存储传输时不会损失任何音频数据,保证了音频的原始质量。这种无损的特性让WAV非常适合于高质量音频的制作存档。高解析度支持。

weixin_32311823的博客 1022

刀剑音效,unity游戏拔剑、挥剑声音.zip

刀剑音效,剑刺声,拔剑、挥剑声音 刀剑音效,unity游戏拔剑、挥剑声音 刀剑音效,unity游戏拔剑、挥剑声音

C实现 音效功能

在 C 语言中实现音效功能可以使用一些音频库,如 OpenAL、SDL_mixer 等。 使用这些库可以轻松地播放、暂停、停止循环音频文件,还可以调整音量、音调等参数。 下面是一个简单的例子,使用 SDL_mixer 库播放一个 WAV 格式的音频文件: #include <SDL2/SDL_mixer.h> int main() { // 初始化 SDL_mixer 库 ...

weixin_35753291的博客 988

C语言实现播放音乐

C语言实现播放音乐源代码 为了使我们的程序看起来更加人性化,有时候我们需要加入一些声音,今天学习了一种播放声音的函数PlaySound的用法。 1.使用PlaySound函数需包含头文件 #include <windows.h> 2.包含第三方库 以CodeBlock为例,右键工程,选择构建 点击链接器设置,点击添加 添加 libwinmm.a 确定即可 源代码 #include <stdio.h> #include <stdlib.h> #include &l

qq_53226525的博客 6368

如何在c语言中播放音频

要在 C 语言中播放音频,你可以使用一些库函数,例如 OpenAL,SDL 或者 PortAudio。 这些库都可以在 C 语言中使用,它们提供了播放音频相关的函数。 例如,使用 OpenAL 库可以这样播放音频: 首先,你需要包含 OpenAL 头文件: #include <AL/al.h> #include <AL/alc.h> 然后,打开音频设备: ALCde...

weixin_35752233的博客 1947

C# 六种播放声音方法----同时实现背景音乐音效播放

这里要说的是几种播放声音的测试结果,希望可以帮助在用到C#做声音播放应用的朋友。这几种播放方式同时使用可能会发生冲突,停止当前播放声音,只去播放一种声音,达不到应用效果,我怀疑几种播放方式都是调用的SoundPlayer来进行播放的;如查没有添加,在左侧打开“工具箱”,在“工具箱”内点右键,选择右键菜单“选择项”,在“选择工具箱项“窗口中,选择“COM组件”项,下拉到“Windows Media Player”,在单选框上打上勾,点击确定后组件被加入到工具箱中。第2个参数是播放方式,这里是循环播放

wu437的博客 3797

游戏音乐音效播放

游戏音乐音效播放 2008-04-18 09:30:55| 分类: 游戏世界 | 标签: |字号大中小 订阅 游戏音乐音效播放 在Win32环境下,播放音乐音效的方法太多了,而且有一个共同点就是:你不需要花很大的心力就可以得到你需要的东西。延续主题式的探讨,这一期我们着重在音乐音效播放

电脑翻译官的专栏 1017

添加了背景音乐自动游戏功能的 JS版 2048

根据网上资源修改添加了背景音乐自动游戏功能的javascript版2048游戏

MMORPG游戏音乐音效系统策划

音乐音效系统在MMORPG游戏中的作用不可小觑,它不仅决定了玩家的沉浸感,还直接影响到游戏的氛围玩家的情感体验。通过精心策划音乐音效的系统设计,结合高效的技术实现,能够大大增强游戏的代入感、互动感情感传递,提升玩家的整体体验。在未来,随着虚拟现实增强现实等技术的发展,音乐音效系统还将进一步向更加动态、实时个性化的方向发展。音乐音效系统在MMORPG游戏中扮演着至关重要的角色。一个优秀的音效系统不仅能够增强游戏的沉浸感互动性,还能够提升游戏的情感表达,强化玩家虚拟世界的连接。

小宝哥Code的专栏 2054

超越常规播放器!VGMstream让你的游戏音乐库全面复活

无论是为了怀旧还是工作需要,VGMstream都是你不可或缺的游戏音频解码利器。告别格式兼容的烦恼,尽情享受那些经典游戏带来的听觉盛宴吧!🎧

gitblog_01057的博客 904

“声音”音源设置音效播放

摄像机上有Audio Listener原因就是有时候可以使用一些3D的音效,只有走进的时候,才会播放,这样的话,我们就会挂载特殊的物体身上,比如野猪来回巡逻的时候,可能会发出喘息声走路的声音,在他身上会有一个移动的音效,他也有一定的范围,只有我们的摄像机进入这个范围之后,才能够监听这个音效,我们其他的音效,攻击跳跃等等,不会持续不断的播放,也不会在游戏一开始就播放,所以我们再添加另外一个Audio Source,这个取消勾选Play On AwakeLoop,用这个来播放其他的音效

zhaokuangkuang_的博客 2454

Python实现游戏中的音乐音效制作音频处理

让我们一起探索新奇的事物,分享生活的点滴,让这个小角落成为我们共同的精神家园。而Python,这门以简洁著称的编程语言,不仅在数据分析、机器学习等领域大放异彩,在音频处理方面也展现出了强大的能力。你可以把这里当作自己的家,无论是工作之余的小憩,还是寻找灵感的驿站,我都希望你能在这里找到属于你的那份快乐满足。那么,今天的分享就到这里了,希望你们喜欢。的音频模块,接着加载了三种不同的音频文件,并分别设置了它们的播放方式。

master_chenchen的博客 1330

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

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

taki_dsm的专栏 920
上一篇: 指令集的进步——MMX和SSE (转)
下一篇: Beginner with c# 6 (转)
csd3176
博客等级 码龄11年 20粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值