很多小伙伴在用C语言写游戏时,不知道怎么加音乐,今天一步到位分享给大家!

使用 mciSendString 播放音乐

mciSendString 支持 mp3、wma、wav、mid 等多种媒体格式,使用非常简单。这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,代码如下:

// 编译该范例前,请把 music.mp3 放在项目文件夹中
// 发布时,请把 music.mp3 和编译的 exe 放在一起
// 编译环境:VC6~VC2019 + EasyX_20210115
//
#include <graphics.h>
#include <conio.h>
// 引用 Windows Multimedia API
#pragma comment(lib, "Winmm.lib")int main()
{initgraph(640, 480);// 打开音乐mciSendString(_T("open music.mp3 alias mymusic"), NULL, 0, NULL);outtextxy(0, 0, _T("按任意键开始播放"));_getch();// 播放音乐mciSendString(_T("play mymusic"), NULL, 0, NULL);outtextxy(0, 0, _T("按任意键停止播放"));_getch();// 停止播放并关闭音乐mciSendString(_T("stop mymusic"), NULL, 0, NULL);mciSendString(_T("close mymusic"), NULL, 0, NULL);outtextxy(0, 0, _T("按任意键退出程序"));_getch();closegraph();return 0;
}

丨简单讲解一下:

一定要引用 Winmm.lib 库文件。这个范例中是通过 #pragma comment 命令引用的,也可以在项目属性中设置,这里不作介绍。

mciSendString 函数的功能很强大,甚至可以播放视频,不过这里就不多作介绍了,详细请参见 MSDN。多数情况只需要用到第一个参数,将另外三个参数置为 NULL, 0, NULL 即可。

第一个参数是多媒体命令字符串,不区分大小写。程序中,先要通过 open 命令打开 background.mp3,并用 alias 指定了别名为“mymusic”,这样在之后的代码中就可以方便的通过“mymusic”这个别名访问该音乐了。当然,并不是必须要指定别名,每次通过文件名访问也是可以的。

open 后面的 mp3 用绝对路径或相对路径都可以。

然后就是:play mymusic 开始播放,stop mymusic 停止播放,close mymusic 关闭文件。

如果需要同时播放多个音乐,请为不同的音乐指定不同的别名,然后分别操作即可。

不再需要播放的音乐,请记得用 close 命令关闭。

另外还有一个 PlaySound 函数也可以用来播放声音,不过可惜不支持 mp3 / wma,这里就不多做介绍了。

丨一些有用的多媒体命令:

从头播放 xxx:

"play xxx from 0"

循环播放 .mp3 文件(.wma 文件同样可以):

"open xxx.mp3"
"play xxx.mp3 repeat"

循环播放 .wav 文件(.mid 文件同样可以):

"open xxx.wav type MPEGVideo"
"play xxx.wav repeat"

关闭当前程序打开的所有多媒体文件:

"close all"

如果文件名中有空格,需要用双引号引起来文件名(注意转义):

mciSendString("open \"D:\\My Music\\俞丽拿 梁祝 化蝶.mp3\" alias mymusic", NULL, 0, NULL);

实际中可能会遇到各种各样的问题,可以到访我的编程俱乐部交流解决~

使用 mciSendCommand 播放音乐

mciSendCommand 与 mciSendString 的功能类似,只是控制方式略有区别。因此,对 mciSendCommand 不做过多介绍,只看一个使用例子吧。以下范例实现 mp3 的循环播放:

// 该范例演示使用 mciSendCommand 函数循环播放 mp3
// 编译环境:VC2008~VC2019 + EasyX_20210115
//
#include <graphics.h>
#include <Digitalv.h>
#include <conio.h>
#pragma comment(lib, "winmm.lib")int main()
{initgraph(640, 480);// 打开音乐文件MCI_OPEN_PARMS mciOpenParms;mciOpenParms.lpstrDeviceType = L"sequencer";mciOpenParms.lpstrElementName = L"R:\\Downloads\\test.mp3";mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, DWORD_PTR(&mciOpenParms));   // 打开指定媒体文件UINT wDeviceID = mciOpenParms.wDeviceID;    // 返回的 Device ID 需要保存下来,以便实现后续控制outtextxy(0, 0, L"按任意键开始播放");_getch();// 播放音乐MCI_PLAY_PARMS mciPlayParms;mciSendCommand(wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, DWORD_PTR(&mciPlayParms));outtextxy(0, 0, L"按任意键停止播放");_getch();// 停止播放并关闭音乐mciSendCommand(wDeviceID, MCI_STOP, 0, NULL);  // 停止播放mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);   // 关闭音乐outtextxy(0, 0, L"按任意键退出程序");_getch();closegraph();return 0;
}

解决某些 MP3 无法播放的问题

有些 mp3 无法用 mciSendString 播放,是因为用了比较大的封面,我测试过一个 mp3 的封面尺寸是 1824x1824,直接无法播放。将封面尺寸修改为 500x500,顺利播放。当然,更简单的办法是直接移除封面。

使用 PlaySound 函数播放音乐

PlaySound 可以用来播放 wav 和系统声音,使用很简单,一些常用的用法如下:

// 注意:
// 1. 需要使用预编译指令 #pragma comment(lib, "winmm.lib") 链入库文件
// 2. 第一个参数是字符串,注意使用程序中约定的字符集,例如 Unicode 字符集需要在字符串前面加 L
//
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_SYNC);               // 播放 Bells.wav,并等待直到播放结束
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_ASYNC);          // 后台播放 Bells.wav,函数立即返回
PlaySound("SystemExclamation", NULL, SND_ASYNC);              // 后台播放系统定义的 SystemExclamation 声音
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_LOOP | SND_ASYNC);   // 后台循环播放 Bells.wav
PlaySound(NULL, NULL, 0);                                       // 停止后台播放

更强大的音乐播放库

更强大的音乐播放可以用 bass 或 fmod 库,这里不做过多介绍。

——————————————

不管你是转行也好,初学也罢,进阶也可,如果你想学编程~

【值得关注】我的 编程学习交流俱乐部【点击进入】

如何在C语言游戏代码中加入音乐?相关推荐

  1. 贪吃蛇c语言 游戏中会出现障碍物,贪吃蛇C语言游戏代码.doc

    贪吃蛇C语言游戏代码 //开始编写游戏需要的类 #include //EasyX_2011惊蛰版(绘图库) #include #include #include #define UP1 #define ...

  2. 为什么c语言加法错误,分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)...

    重构 题目的修正 我抛弃了原题中"其中a, b, c, d是一个0-9的整数"这样的前提条件,因为这种限制毫无必要.只假设a, b, c, d是十进制整数形式的字符序列. 我也不清 ...

  3. c语言间接级别不同_一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)...

    问题: 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己代码的改进和优化.标题只是为了保持系列的连续性. 改进 程 ...

  4. C语言初学者代码中的常见错误与瑕疵(9)

    题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T ...

  5. c语言一个数中是否含有8,要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)...

    在 飞鸟_Asuka网友指出"是不是时间复杂度比较大",并说他"第一眼看到我就想把它当成一个数学问题来做"之后,我又重新对问题进行了数学式的思考后发现的. 这个 ...

  6. 如何在Mac上的视频中添加音乐?

    自己录的视频没有音乐伴奏总是不完整的,怎样添加上音乐呢?在本篇文章中,我为大家介绍的是如何在Mac上的视频中添加音乐? 在这里,我们向您展示如何在Mac计算机上将音乐添加到视频中.这些工具可离线使用, ...

  7. c语言游戏代码(c语言制作小游戏)

    用C语言编写的小游戏代码是什么? /*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++6.0.turbo----)上都能运行,你还可以进 ...

  8. C语言初学者代码中的常见错误与瑕疵(2)

    问题: 另一种阶乘 大家都知道阶乘这个概念,举个简单的例子:5!=1*2*3*4*5. 现在我们引入一种新的阶乘概念,将原来的每个数相乘变为i不大于n的所有奇数相乘 例如:5!!=1*3*5.现在明白 ...

  9. c语言程序代码中的间隔,printf()函数输出后 默认的间隔是多少

    7楼那么输出应该就可以了,不过楼主显然不是这个意思,问题的关键在于普通输出都是直接%d而它用%2d是不是这个2搞的!? ----------------解决方案-------------------- ...

最新文章

  1. 58集团技术委员会主席:斗胆谈一谈,我是如何做到年薪百万的!!!
  2. MacOS下打包Python应用
  3. CV:Win10下深度学习框架安装之Tensorflow/tensorflow_gpu+Cuda+Cudnn(最清楚/最快捷)之详细攻略(图文教程)
  4. 【工业控制】OmniCal软件安装和使用详解
  5. 计算机技术在办公自动化中的应用,计算机技术在办公自动化中的应用浅析.doc...
  6. 【2016年第6期】21世纪天文学面临的大数据和研究范式转型
  7. Node连接MySQL数据库进行基本的增删改查操作(一看就会)
  8. YUV420查表法高效、无失真的转换为RGB32格式
  9. TinyPNG批量压缩工具脚本Python
  10. MATLAB信号与系统实验(一)
  11. Ubuntu下声卡驱动解决方法alsa
  12. 关于微信授权登录的用户取消-2的问题
  13. 计算机考试excel统计图怎么做,excel表格取数据做统计图-Excel如何制作统计数据...
  14. NTP网络授时服务器在电视播出系统中的应用
  15. 我是小交易所老板,我现在很慌
  16. error C2872: “ACCESS_MASK”: 不明确的符号
  17. 字节面试:谈谈索引为什么能提高查询性能?
  18. 如来昔在然灯是和所时_TGB
  19. 【ExpandTabView】Android 仿大众,美团下拉菜单ExpandTabView
  20. python学习——绘制loss、acc学习曲线

热门文章

  1. Unity低模动物动画最新版Low Poly Animated Animals2.31官网包
  2. 登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。
  3. html 5 桌面弹窗,HTML5+CSS3+jQuery实现弹出层
  4. marketch直接生成html,Marketch 用法
  5. CAD快速看图怎么看
  6. 东北大学计算机考研哪个方向好,2012考研:东北大学计算机三个方向区别
  7. 药品监管系统架构揭秘:海量溯源数据存储与查询
  8. stm32实用篇3: 字符显示字库生成
  9. 树莓派zero USB OTG直连
  10. oracle数据泵的原理,oracle 数据泵 详解