「C++小游戏教程」基本技巧(3)——发声函数 Beep()

0. 引言

放图:
0
显而易见了(

注意:该函数只存在于 Windows 系统下的 windows.h 中,而 windows.h 不存在于 bits/stdc++.h 中。


1. 什么是 Beep()

Beep() 是 windows.h 下的一个用于发声的函数。函数原型:

BOOL Beep(
	DWORD dwFreq;  
	DWORD dwDuration;
);

其中的 dwFreq 是发声频率(单位 Hz),而 dwDuration 是发声时长(单位 ms)。


2. Beep() 的意义

用于游戏中的发声,使得游戏内容丰富生动,具有立体感。


3. 怎么用 Beep()

我们既然已经知道了第一个参数是发声频率,我们要如何获取 ⋯   , 1 .  , 2 .  , ⋯   , 7 .  , 1 , 2 , ⋯   , 7 , 1 ˙ , 2 ˙ , ⋯ \cdots,1\kern{-4px}\raisebox{-3px}{. },2\kern{-4px}\raisebox{-3px}{. },\cdots,7\kern{-4px}\raisebox{-3px}{. },1,2,\cdots,7,\dot{1},\dot{2},\cdots ,1,2,,7,1,2,,7,1˙,2˙, 甚至 ♯ 2 , ♭  ⁣ 4 ^\sharp 2,^\flat\!4 2,4 等的频率呢?
目前网络上主要流行以下这段宏定义代码,可以满足一般的需要:

//q前缀为低音,p后缀为高音,s前缀为半音阶
#define qdo 262
#define qre 294
#define qmi 330
#define qfa 349
#define qso 392
#define qla 440
#define qsi 494
#define do 523//一般情况下 do 建议改为 do_, DO, Do 等非关键字的内容
#define re 578
#define mi 659
#define fa 698
#define so 784
#define la 880
#define si 988
#define dop 1046
#define rep 1175
#define mip 1318
#define fap 1480
#define sop 1568
#define lap 1760
#define sip 1976
#define sqdo 277
#define sqre 311
#define sqfa 370
#define sqso 415
#define sqla 466
#define sdo 554
#define sre 622
#define sfa 740
#define sso 831
#define sla 932
#define sdop 1046
#define srep 1245
#define sfap 1480
#define ssop 1661
#define slap 1865

那用起来也是很方便,比如 1 .  1\kern{-4px}\raisebox{-3px}{. } 1 对应 qdo 4 ˙ \dot{4} 4˙ 对应 fap ♯ 2 ^\sharp 2 2 ♭ 3 ^\flat 3 3 非特殊情况下均可以是 sre
而对于节拍,一般情况下,为了方便,四分音符为一拍是 400 ∼ 500 ms 400\sim500\text{ms} 400500ms
至于休止符,将会用到以后讲的 Sleep()


4. 举例

比如一下这段简谱:
1   1 ‾   4. ‾ 5 ‾ ‾   ∣   1. ‾ 4 ‾ ‾   1 ˙   ∣   ♯ 1 ˙   4   5 ‾   ∣   1 ˙   −   ∣   4   − \underline{1\ 1}\ \underline{4.}\underline{\underline{5}}\ |\ \underline{1.}\underline{\underline{4}}\ \dot{1}\ |\ ^\sharp\dot{1}\ \underline{4\ 5}\ |\ \dot{1}\ -\ |\ 4\ - 1 1 4.5  1.4 1˙  1˙ 4 5  1˙   4 
我们可以这么写:

Beep(do,250);
Beep(do,250);
Beep(fa,375);
Beep(so,125);
Beep(do,375);
Beep(fa,125);
Beep(dop,500);
Beep(sdop,500);
Beep(fa,250);
Beep(so,250);
Beep(dop,1000);
Beep(fa,1000);

散发着臭的进行曲(
那最后向读者们展示一份代码,运行后猜猜看这是什么音乐,欢迎把答案留在评论区~

for(int i=1;i<=2;i++)
{
	Beep(fa,500);
	Beep(si,500);
	Beep(la,500);
	Beep(so,1000);
	Beep(fa,500);
	Beep(la,500);
	Beep(so,500);

	Beep(fa,500);
	Beep(si,500);
	Beep(la,500);
	Beep(so,500);
	Beep(fa,500);
	Beep(la,500);
	Beep(fa,1000);

	Beep(fa,500);
	Beep(si,500);
	Beep(la,500);
	Beep(so,1000);
	Beep(fa,500);
	Beep(la,500);
	Beep(so,500);

	Beep(fa,2000);
	Beep(so,1000);
	Beep(la,1000);
}
Beep(fa,500);
Beep(si,500);
Beep(la,500);
Beep(so,1000);
Beep(fa,250);
Beep(so,250);
Beep(fa,250);
Beep(so,250);
Beep(fa,250);
Beep(so,250);

Beep(fa,500);
Beep(si,500);
Beep(la,500);
Beep(so,500);
Beep(fa,500);
Beep(la,250);
Beep(so,250);
Beep(fa,1000);

Beep(fa,500);
Beep(si,500);
Beep(la,500);
Beep(so,1000);
Beep(fa,250);
Beep(so,250);
Beep(la,250);
Beep(so,250);
Beep(fa,250);
Beep(so,250);

Beep(fa,2000);
Beep(so,1000);
Beep(la,1000);

Beep(so,500);
Beep(si,125);
Beep(la,125);
Beep(si,125);
Beep(la,500);
Beep(so,1000);

Beep(fa,250);
Beep(so,250);
Beep(so,250);
Beep(fa,250);
Beep(fa,250);
Beep(so,250);

Beep(fa,500);
Beep(si,125);
Beep(la,125);
Beep(si,125);
Beep(la,500);
Beep(so,500);

Beep(fa,500);
Beep(la,250);
Beep(so,250);
Beep(fa,1000);

Beep(fa,500);
Beep(so,125);
Beep(so,125);
Beep(so,125);
Beep(so,500);
Beep(la,500);

Beep(si,500);
Beep(fa,250);
Beep(so,250);
Beep(la,250);
Beep(so,250);
Beep(fa,250);
Beep(so,250);
Beep(fa,2000);

5. 后记

文不长,但希望读者可以理解。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值