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
#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=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
#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=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