目录
问题1:SDL_CreateWindowAndRenderer和SDL_CreateWindow的区别?
问题2:SDL_CreateTextureFromSurface的作用?(网上查询结果)
上一篇博文主要是讲解了SDL2库播放音频 ,本文才进入主题,主要是对SDL2库的基本使用,了解了SDL2的使用基础上之后,后期对其进行拓展使用将会快速的上手,并且可以了解到SDL2的应用非常广泛。而且使用起来也比较灵活,在某些应用上和OpenCV有类似之处。
实现思路
- 创建窗口和渲染器,用于显示图像或者其他画面;
- 事件处理(比如按下鼠标键盘事件加载图像,显示图像,矩形等操作);
- 渲染器渲染图像,矩形等内容。
- 显示结果(SDL_RenderPresent)。
一个键盘事件案例基础
问题1:SDL_CreateWindowAndRenderer和SDL_CreateWindow的区别?
SDL_CreateWindow:
- 只创建一个窗口。创建窗口后,如果需要进行渲染,开发者必须手动使用
SDL_CreateRenderer
来创建一个渲染器。
SDL_CreateWindowAndRenderer:
- 一次性创建一个窗口和与之关联的渲染器。这个函数同时创建了这两个对象,简化了窗口和渲染器的获取过程。
注:SDL_CreateWindow只是创建了一个窗口,如果要显示图像等内容的话,需要创建一个渲染器。
以下是一个键盘按下的响应案例:
https://github.com/KeepTryingTo/QT_Learning/tree/main/QtSDL_Application/QtSDL_KEYDOWN
SDL2实现一个简单的键盘按下事件
SDL2_ttf和SDL2_image库使用方式
① 由于需要渲染绘制文字,因此SDL2_ttf需要单独下载,关于SDL2_ttf库的使用方式和使用SDL2方式一样,下载链接:https://github.com/libsdl-org/SDL_ttf/releases
② 渲染图像也是一样的道理,下载编译好的库文件SDL2_image,然后加载库文件,下载链接:https://github.com/libsdl-org/SDL_image/releases
注:由于SDL2_ttf和SDL2_image库中的依赖库和头文件都很少,建议直接复制到之前配置的库路径下即可。
可以加载Windows中自带的字体:C:\\Windows\\Fonts\\Times New Roman.ttf
问题2:SDL_CreateTextureFromSurface的作用?(网上查询结果)
SDL_Surface
通常用于存储图像的像素数据和信息(如宽度、高度、格式等),而SDL_Texture
是更高效的图像表示形式,适合在 GPU 上进行渲染。- 纹理 (
SDL_Texture
) 通常位于 GPU 内存中,能够比在 CPU 内存中的表面更高效地进行渲染。使用纹理来绘制图像可以显著提高绘制性能,尤其是在需要频繁更新屏幕内容的场景中。
绘制本文的SDL2_ttf库初始化:
绘制图像的SDL_image库初始化子系统:
* - `IMG_INIT_JPG`
* - `IMG_INIT_PNG`
* - `IMG_INIT_TIF`
* - `IMG_INIT_WEBP`
* - `IMG_INIT_JXL`
* - `IMG_INIT_AVIF`
PNG(便携式网络图形格式): 具有无损压缩、透明支持。
JPEG(联合图像专家组格式):适用于照片和复杂图像,采用有损压缩。
BMP(位图文件格式): 对于基本图像格式,通常没有压缩。
GIF(图形交换格式): 支持动图和透明色,但采用8位色彩。
TGA(TARGA格式): 支持图像的无损压缩和透明度。
WEBP(谷歌的图像格式): 支持无损和有损压缩。
问题三:从网上下载的图像,加载图像的过程报错误,
如果从网上下载的图像并且加载图像的过程中报以下错误的话,那么需要到libwebp动态库 下载libwebp源码,由于官方并没有提供编译好的源码,因此需要自己编译,关于编译源码的过程请看:https://mydreamambitious.blog.csdn.net/article/details/141427212 (加载本地相册的图像应该不会报这个错误)。
其次进入命令行对图像进行解码操作:dwebp [输入图像] -o [输出图像]
注:经过解码得到的output.jpg图像可以用于IMG_LoadTexture函数加载了,可能也许会有人问了,是不是在初始化IMG_Init的时候把IMG_INIT_JPG放在了最前面,不是的,读者可以尝试一下调换位置还是会报这个错误,主要还是因为直接从网上下载的图像编码格式可能存在问题,需要使用libwebp进行转换。
SDL2实现的音频播放
关于使用SDL2实现的音频播放界面代码,请看链接:https://github.com/KeepTryingTo/QT_Learning/tree/main/QtSDL_Application/QtSDL_AudioPlayer_v2
SDL2利用自带窗口实现音频播放