扩展库
虽然SDL为多个系统提供了广泛的API,但它忽略了某些领域,而在其他领域缺乏功能。扩展库解决了这个问题,以模块化方式添加了更多功能。
热门扩展:
- SDL_Net
- 提供网络API
- SDL_GPU [beta]
- 替换渲染API
- SDL_FontCache [beta]
- 提供字体缓存支持
我们将在本课程中介绍如何设置和使用SDL_Image和SDL_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_Volume,Mix_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增加链接库
测试: