2024-3-20-SDL2开发二

2024-3-20-SDL2开发二

三月 20, 2024

aaa

上一篇讲了SDL2项目首先要做的三件事,以及一些基础函数。

这篇接着搞没讲完的

  1. 第四件事,优化代码

    添加SDL_FreeSurface(gPNGSurface);释放资源

​ 添加SDL_UpdateWindowSurface( gWindow );刷新屏幕

​ 添加close();关闭SDL2记得return 0;

​ (待补充)

  1. 第五件事 先会用SDL 1.0版本的 Surface SDL_Render系列,但是我现在懒得写,

示例

1
gSurface = SDL_GetWindowSurface(gWindows);

要使用先初始化,但是一旦初始化了Surface,gwindow就不可以用来初始化别的了。

  1. 第六件事,纹理和渲染器,SDL 2.0版本降临

Surface 和 Texture 的区别:

​ Surface 使用CPU进行处理,存在于内存

​ Texture使用GPU处理,背后使用了OpenGL和Direct3D接口,让游戏更流畅更快。

Render可以渲染Texture

创建渲染器:

1
SDL_Renderer* renderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_SOFTWARE);

其中SDL_RENDERER_SOFTWARE代表使用软件加速,-1代表使用第一块显卡,而SDL_CreateRenderer必须要接受3个参数。

ps: 除此之外的其他常量还有SDL_RENDERER_ACCELERATED代表硬件加速,实际上就是2,而是软件加速是1

读取图像:

1
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );

然后转换

1
SDL_CreateTextureFromSurface(loadedSurface);

常见问题三

1
2
3
4
5
||=== 构建: Debug 在 demo04 中 (编译器: GNU GCC Compiler) ===|
main.cpp||In function 'int SDL_main(int, char**)':|
main.cpp|135|error: cannot convert 'SDL_Surface*' to 'SDL_Texture*'|
SDL2\SDL_render.h|1410|note: initializing argument 2 of 'int SDL_RenderCopy(SDL_Renderer*, SDL_Texture*, const SDL_Rect*, const SDL_Rect*)'|
||=== 构建 结束: 1 错误, 0 警告 (0 分, 0 秒) ===|

接收类型不正确?

排查了半天是头文件里的声明忘了

1
extern SDL_Texture* gPNGSurface; 

在检查全局变量类型时,是按照头文件的传输类型来检查的。


SDL_Rect结构体

  • SDL_Rect结构体是Simple DirectMedia Layer (SDL) 中用于表示矩形区域的数据结构。它通常用于游戏开发和图形处理中。SDL_Rect 结构体包含四个整数成员,分别表示矩形区域的左上角的 x 和 y 坐标,以及矩形的宽度和高度。通过SDL_Rect结构体,开发人员可以方便地定义、操作和管理矩形区域,用于绘制图形、碰撞检测等功能。

    • 也就是说,如果截取到了角落的部分则会被拉伸