SDL2系列教程7-声音和扩展库

扩展库

虽然SDL为多个系统提供了广泛的API,但它忽略了某些领域,而在其他领域缺乏功能。扩展库解决了这个问题,以模块化方式添加了更多功能。

热门扩展:

 

我们将在本课程中介绍如何设置和使用SDL_ImageSDL_Mixer

SDL_Image

到目前为止,我们只能加载位图图像。这是一个痛苦的原因有几个 - 位图无法压缩,很难让它们保存alpha数据,而且从网上下载的大多数图像格式都不正确。SDL_Image添加了一小组函数来加载其他图像类型,包括PNG,JPG,GIF和TIFF。

启动

大多数扩展需要与核心SDL_Init()分开的启动调用。对于SDL_image,这是IMG_Init()。此函数采用许多标志来表示要加载的图像类型。通常,这将是IMG_INIT_JPG和IMG_INIT_PNG。

int result = IMG_Init( IMG_INIT_JPG | IMG_INIT_PNG );

// Check load
if ( result != 0 ) {
	cout << "Failed to initialize SDL_image: " << IMG_GetError() << endl;
}

图片加载

SDL_image唯一非常重要的功能是IMG_Load()。它的工作方式与SDL_LoadBMP()完全相同,只是它可以加载您初始化SDL_image的任何图像格式

SDL_Surface* image = IMG_Load("image.png");

// Check load
if ( !image ) {
	cout << "Failed to load image.png: " << IMG_GetError() << endl;
}

关掉

当您关闭程序时,只需记住调用IMG_Quit()以及SDL_Quit()

IMG_Quit();
SDL_Quit();

这就是你需要了解的关于SDL_image的所有信息; 这是一个非常简单和直接的扩展。您可以查看文档以更好地了解每个函数的工作原理。

SDL_Mixer

SDL提供了一个用于加载和播放音频的API,但它相对较低,在更高级的环境中使用会非常复杂。SDL_mixer提供类似于SDL_image的简化声音加载和回放API。可以在此处找到API文档。

启动

与SDL_image一样,SDL_mixer有自己的初始化函数Mix_OpenAudio()。从技术上讲,SDL_mixer是用Mix_Init()初始化的,但Mix_OpenAudio()会为你调用它。Mix_OpenAudio()描述了如何格式化音频输出。参数包括采样频率(44100是CD质量,但许多游戏使用22050),数据格式,通道数量(1 =单声道,2 =立体声)和块大小(声音效果约为1024,如果你需要防止跳过)。

int result = Mix_OpenAudio( 44100, MIX_DEFAULT_FORMAT, 2, 1024 );

// Check load
if ( result != 0 ) {
	cout << "Failed to open audio: " << Mix_GetError() << endl;
}
Mix_Music* music;
Mix_Chunk* sound;

music = Mix_LoadMUS("music.wav");
sound = Mix_LoadWAV("sound.mp3");

// Check load
if( !music || !sound ) {
	cout << "Failed to load music or sound: " << Mix_GetError() << endl;
}

音频加载

加载音频就像加载图像一样简单。SDL_mixer提供两种类型的音频对象,Mix_Chunk表示声音片段,Mix_Music表示用作背景音乐的较长声音片段。使用Mix_LoadMUS()Mix_LoadWAV()函数加载这些类型。这两个函数都采用音频文件路径。最后,虽然该功能在名称中有WAV,但它实际上可以加载许多不同的音频格式,包括WAV,MP3和OGG。

Mix_Music* music;
Mix_Chunk* sound;

music = Mix_LoadMUS("music.wav");
sound = Mix_LoadWAV("sound.mp3");

// Check load
if( !music || !sound ) {
	cout << "Failed to load music or sound: " << Mix_GetError() << endl;
}

播放音乐

播放音乐比播放声音更简单,因为您只能同时播放一首音乐流。音乐由函数Mix_PlayMusic()Mix_PauseMusic()Mix_ResumeMusic()Mix_HaltMusic()等管理。除了Mix_PlayMusic()之外,这些函数都会或多或少地执行您期望的操作,并且不接受参数。此函数使用指向您要播放的已加载音乐的指针,以及循环播放的次数(无限为-1)。如果音乐已播放,Mix_PlayMusic()将暂停上一个流并重新开始。

int result = Mix_PlayMusic( music, -1 );

if ( result != 0 ) {
	cout << "Failed to play music: " << Mix_GetError() << endl;
}

播放声音

播放声音有点复杂,因为您可以同时播放多种声音,并且可以为每种声音调整一些设置。基本上,您可以分配一定数量的频道,每个频道都可以代表当前播放的声音。然后,您可以设置要在频道上播放的声音。要暂停声音,更改音量等,您必须参考当前播放声音的频道ID。

这些功能由Mix_AllocateChannels()Mix_PlayChannel()Mix_VolumeMix_Pause()Mix_Resume()Mix_HaltChannel()等功能控制。同样,这些大多是不言自明的。

Mix_PlayChannel()有三个参数:要播放的频道(或第一个可用频道为-1),要播放的Mix_Chunk,以及第一次播放后循环播放的次数(即0 - >播放一次)。它返回它使用的通道。

int channel = Mix_PlayChannel( -1, sound, 0 );

Mix_Pause( channel );

SDL_Delay( 1000 );

Mix_Resume( channel );

我强烈建议查看文档以获取有关API其余部分的信息,并更好地掌握API函数如何协同工作。

关掉

与SDL_image一样,SDL_mixer有自己的退出函数Mix_Quit()。这应该在程序结束时使用其他关闭功能调用。此外,您必须分别使用函数Mix_FreeMusic()Mix_FreeChunk()释放加载的Mix_Musics和Mix_Chunks 。

Mix_FreeChunk( sound );
Mix_FreeMusic( music );

Mix_Quit();
SDL_Quit();

安装扩展库

sudo apt-get install libsdl2-image-dev 

sudo apt-get install libsdl2-mixer-dev

实例代码下载地址

https://download.csdn.net/download/cyf15238622067/10697657

Makefile增加链接库

测试:

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/82907753