前言
前段时间为了写 贪吃蛇2.0版 程序需要用到背景音乐以及主音乐摸索了半天,在博客以及百度找了好几天,发现很少有人回答了这个答案,有的也只是用多管道多线程控制音乐,本人又不会使用多线程,使用多线程也不方便,所以反复在各大网站摸索之后终于找到了解决办法,该方法不需要建立多管道多进程,不需要C++,C语言就能搞定,并且自定义函数后多出可以随时调用,方便快捷,今天分享出来给大家。
查找这些资料以及写这篇文章都花费了我不少相思,希望您能留下您的点赞,你的点赞是我继续创作的最大动力!!
正言
PlaySound函数在播放音乐时,遇到下一个PlaySound函数时会被打断是不可避免的,所以我们可以同时引用另外一个函数:
BOOL mciSendString(“Command1 FILE Command2”,NULL,0,NULL);
先介绍:
PlaySound函数
PlaySound函数只能播放WAV格式的音频文件,无法播放MP3格式或者其它格式的音频文件,所以在使用的时候记得先行转码在使用
使用PlaySound函数时要包含以下头文件:
#include<windows.h>
#pragma comment(lib,"winmm.lib")
函数原型:
BOOL PlaySound( TEXT(“FILE”) , NULL , DWORD fdwSound );
FILE:
[路径+] 媒体文件名
如:
123.wav
D:\\Download\\123.wav
fdwSound:
用来指定播放模式,常用参数如下:
*SND_ASYNC
用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME
pszSound参数指定了WAVE文件名。
SND_LOOP
重复播放声音,必须与SND_ASYNC标志一块使用。
代码实例:
//循环播放同目录下的123.wav音频文件
PlaySound(TEXT("123.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
//播放一次绝对目录D:\Download\下的123.wav音频文件
PlaySound(TEXT(D:\\Download\\123.wav),NULL,SND_FILENAME | SND_ASYNC);
//结束播放音频
PlaySound(NULL,NULL,SND_FILENAME);
我们可以写一个控制播放音乐的自定义函数:
void Music(char c[],int n)
{
switch(n)
{
case 2:
//循环播放音乐,在遇到下一次播放音乐时被打断
PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
break;
case 1:
//播放一次音乐,在遇到下一次播放音乐时被打断
PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC);
break;
case 0:
//停止播放背景音乐
PlaySound(NULL,NULL,SND_FILENAME);
break;
}
}
再介绍:
mciSendString函数
mciSendString函数对大部分媒体文件都适用,包括视频文件、音频文件都适用
在播放音频文件时似乎播放MP3格式有效,无法播放WAV格式的音频(可能是我电脑的问题吧)
mciSendString函数实际上是MCI函数,该函数执行效率比较低
需要引用头文件(实际上跟PlaySound函数一样):
#include<windows.h>
#pragma comment(lib,"winmm.lib")
函数原型:
BOOL mciSendString("Command1 FILE Command2",NULL,0,NULL);
Command1:
对媒体文件的操作方式。
常见的操作方式:
play
开始播放媒体文件
pause
暂停播放媒体文件
stop
结束播放媒体文件
FILE:
[路径+] 媒体文件名
如:
123.mp3
D:\\Download\\123.mp3
Command2:
播放媒体文件的模式
常见的播放模式:
repeat
重复播放
from A to B
从磁道A播放到磁道B结束
wait
等待媒体文件播放结束后命令才返回
不加Command2命令则默认播放一次
实例:
//重复播放同目录下的123.MP3文件
mciSendString("play 123.mp3 repeat",NULL,0,NULL);
//播放一次绝对目录下的D:\\Download\\123.MP3音乐
mciSendString("play D:\\Download\\123.mp3",NULL,0,NULL);
//结束播放
mciSendString("close D:\\Download\\123.mp3",NULL,0,NULL);
所以我们可以写一个自定义播放背景音乐的自定义函数:
//n代表模式,0为停止播放,1为播放一次,2为重复播放
void BGM(char c[],int n)
{
char File[100];
if(n==1||n==2)
strcpy(File,"play ");
else if(n==0)
strcpy(File,"close ");
strcat(File,c);
if(n==2)
strcat(File," repeat");
mciSendString(File,NULL,0,NULL);
}
以上基本上就是两个函数的基本用法,通过mciSendString函数播放背景音乐,用PlaySound函数播放游戏其他音乐一举两得
接下上代码:
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#pragma comment(lib,"Winmm.lib")
//控制游戏前端音乐
void Music(char c[],int n)
{
switch(n)
{
case 2:
//循环播放音乐,在遇到下一次播放音乐时被打断
PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); break;
case 1:
//播放一次音乐,在遇到下一次播放音乐时被打断
PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC); break;
case 0:
//停止播放背景音乐
PlaySound(NULL,NULL,SND_FILENAME); break;
}
}
//控制背景音乐
//n代表模式,0为停止播放,1为播放一次,2为重复播放
void BGM(char c[],int n)
{
char File[100];
if(n==1||n==2) strcpy(File,"play ");
else if(n==0) strcpy(File,"close ");
strcat(File,c);
if(n==2) strcat(File," repeat");
mciSendString(File,NULL,0,NULL);
}
int main()
{
//创建字符用于获取键盘输入
char c;
//打开背景音乐
BGM("Music\\超级玛丽.mp3",2);
while(1)
{
if(kbhit())
{
c=getch();
//如果按下ESC键则退出循环,ESC键的ASCII码为:27
if(c==27) break;
//否则播放123.WAV媒体文件
else Music("123.wav",1);
}
}
//关闭背景音乐
BGM("Music\\超级玛丽.mp3",0);
return 0;
}
以上是本次的全部内容。
第一次写博客,修改了一下午,给个点赞不过分吧^ _ ^