raylib绘图库--瞿华
2022.7.1
知乎 1、raylib绘图库简介

知乎 2、raylib 2d动画/游戏教程(1)动画基本原理

知乎 3、raylib 2d动画/游戏教程(2)坐标系与颜色系统

知乎 4、raylib 2d动画/游戏教程(3)图像文件与图层

知乎 5、raylib 2d动画/游戏教程(4)raylib-drawing库

知乎 6、raylib 2d动画/游戏教程(5)键盘与鼠标输入

知乎 7、raylib 2d动画/游戏教程(6)游戏手柄输入

知乎 8、raylib 2d动画/游戏教程(7)音乐和音效

知乎 9、raylib绘制中文内容

知乎 10、使用raygui绘制控件

知乎 11、raylib 3d绘图基础教程(1)坐标系和摄像机

知乎 12、raylib 3d绘图基础教程(2)网格(Mesh)

知乎 13、raylib 3d绘图基础教程(3)几何变换

知乎 14、raylib 3d绘图基础教程(4)3d模型的载入与绘制

raylib 3d绘图基础教程(7)音乐和音效
1 简介
raylib支持wave、mp3、ogg和FLAC格式的音乐文件。raylib把游戏中的声音分成两类,音效和音乐:

音效用于播放各种短期的声音(小于10秒),比如枪声、爆炸声等等。
音乐用于播放各种长期(超过10秒)或者需要反复播放的声音,比如背景音乐等。
2 音乐的使用
在raylib中,使用Music结构保存要播放的音乐。下面的程序展示了如何在raylib程序中播放、暂停mp3格式的音乐文件。

注意:

在程序开始时要用InitAudioDevice()初始化音乐设备;结束时要用CloseAudioDevice()关闭音乐设备。
在每一帧中都需要执行UpdateMusicStream()函数,以真正播放音乐
如果FPS小于30,可能会出现音乐播放不连续的情况
记得释放打开的音乐对象。

#include <raylib.h>
#define RACOON_FRAMES 12
int main() {
	//初始化音乐设备
	InitAudioDevice();
	InitWindow(800,600,"test");
	SetTraceLogLevel(LOG_WARNING);
	//FPS低于30可能导致音乐播放不连贯
	SetTargetFPS(30);
	//读入图片文件
	Texture tBackground=LoadTexture("background.png");
	//读入拼接图片
	Texture tRacoon = LoadTexture("racoon-total.png");
	//读入音乐并设置为循环播放
	Music bgm=LoadMusicStream("racoon-run-bgm.mp3");
	bgm.looping=true;
	//开始播放音乐
	PlayMusicStream(bgm);
	int stepX=1,racoonX=0,racoonY=300,racoonFrame=0,racoonTargetFrame=0;
	bool musicPause = false;
	while(!WindowShouldClose()) {
		//播放本帧音乐
		UpdateMusicStream(bgm);
		//按下空格键让小浣熊动起来
		if (IsKeyDown(KEY_SPACE)) {
			if (racoonFrame==0)racoonTargetFrame+=RACOON_FRAMES;
			else racoonTargetFrame++;
		}
		//按下P键暂停背景音乐
		if (IsKeyPressed(KEY_P)) {
			musicPause=!musicPause;
			if (musicPause)PauseMusicStream(bgm);
			else ResumeMusicStream(bgm);
		}
		//按下R键重新播放音乐
		if (IsKeyPressed(KEY_R)) {
			StopMusicStream(bgm);
			PlayMusicStream(bgm);
		}
		if (racoonFrame<racoonTargetFrame) {
			racoonFrame++;
			if (racoonFrame>=racoonTargetFrame) {
				racoonFrame=0;
				racoonTargetFrame=0;
			}
			racoonX+=stepX;
		}
		int i = racoonFrame % RACOON_FRAMES;
		int frameX=(i%4)*200;
		int frameY=(i/4)*200;
		BeginDrawing();
			//叠加显示图层。注意显示的顺序
			DrawTexture(tBackground,0,0,WHITE);
			DrawTextureRec(tRacoon,
				(Rectangle){frameX,frameY,200,200},
				(Vector2){racoonX,racoonY},
				WHITE);
		EndDrawing();
	}
	UnloadTexture(tRacoon);
	UnloadTexture(tBackground);
	//释放音乐
	UnloadMusicStream(bgm);
	CloseWindow();
	//关闭音乐设备
	CloseAudioDevice();
}

3 音效的使用
在raylib中,使用Music结构保存要播放的音乐。下面的程序展示了如何在raylib程序中配合动画播放音效。

注意:

在程序开始时要用InitAudioDevice()初始化音乐设备;结束时要用CloseAudioDevice()关闭音乐设备。
记得释放打开的音效对象。

#include <raylib.h>
#define RACOON_FRAMES 12
int main() {
	//初始化音乐设备
	InitAudioDevice();
	InitWindow(800,600,"test");
	SetTraceLogLevel(LOG_WARNING);
	//FPS低于30可能导致音乐播放不连贯
	SetTargetFPS(30);
	//读入图片文件
	Texture tBackground=LoadTexture("background.png");
	//读入拼接图片
	Texture tRacoon = LoadTexture("racoon-total.png");
	//读入音乐并设置为循环播放
	Music bgm=LoadMusicStream("racoon-run-bgm.mp3");
	bgm.looping=true;
	//开始播放音乐
	PlayMusicStream(bgm);
	//降低背景音乐音量,以突出跑步音效
	SetMusicVolume(bgm,0.2);
	//载入跑步声音
	Sound runSound = LoadSound("racoon-run.mp3");
	int stepX=1,racoonX=0,racoonY=300,racoonFrame=0,racoonTargetFrame=0;
	bool musicPause = false;
	while(!WindowShouldClose()) {
		//播放本帧音乐
		UpdateMusicStream(bgm);
		//按下空格键让小浣熊动起来
		if (IsKeyDown(KEY_SPACE)) {
			if (racoonFrame==0)racoonTargetFrame+=RACOON_FRAMES;
			else racoonTargetFrame++;
		}
		//按下P键暂停背景音乐
		if (IsKeyPressed(KEY_P)) {
			musicPause=!musicPause;
			if (musicPause)PauseMusicStream(bgm);
			else ResumeMusicStream(bgm);
		}
		//按下R键重新播放音乐
		if (IsKeyPressed(KEY_R)) {
			StopMusicStream(bgm);
			PlayMusicStream(bgm);
		}
		if (racoonFrame<racoonTargetFrame) {
			racoonFrame++;
			if (racoonFrame>=racoonTargetFrame) {
				//跑步帧结束
				racoonFrame=0;
				racoonTargetFrame=0;
				//停止播放跑步音效
				StopSound(runSound);
			} else {
				//仍在跑步帧
				//如果跑步音效播放完毕,继续播放
				if (!IsSoundPlaying(runSound))PlaySound(runSound);
			}
			racoonX+=stepX;
		}
		int i = racoonFrame % RACOON_FRAMES;
		int frameX=(i%4)*200;
		int frameY=(i/4)*200;
		BeginDrawing();
			//叠加显示图层。注意显示的顺序
			DrawTexture(tBackground,0,0,WHITE);
			DrawTextureRec(tRacoon,
				(Rectangle){frameX,frameY,200,200},
				(Vector2){racoonX,racoonY},
				WHITE);
		EndDrawing();
	}
	UnloadTexture(tRacoon);
	UnloadTexture(tBackground);
	//释放音乐
	UnloadMusicStream(bgm);
	//释放音效
	UnloadSound(runSound);
	CloseWindow();
	//关闭音乐设备
	CloseAudioDevice();
}

本文中所使用的背景音乐文件来源于pixabay.com
本文中所用的素材图片来自opengameart.org,可以直接在百度网盘下载:
链接:https://pan.baidu.com/s/1wGqJ_gBC3KzXmH5tNiR1kA
提取码:vsro