大家好,欢迎来到SDL 2的第五课,我们将在其中分析纹理,简化计算机的工作。 您可以在
这里找到所有英语课程。
在第二版SDL中,有一个很好的机会来创建纹理并渲染它们。 硬件渲染比在窗口中绘制表面要快得多。
纹理具有自己的数据类型
-SDL_Texture 。 使用纹理时,我们需要一个渲染器进行渲染。 现在,我们将宣布所有这些。
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL;
在这里,我们宣布了窗口,渲染和这朵花。

我们还连接了库并设置了窗口大小。
初始化功能也将必须更改。
bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; }
首先,创建
ok变量,以免立即结束函数,而是在初始化期间查找所有错误。 接下来,初始化SDL并以已知方式创建一个窗口。
现在该声明渲染了。
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF);
渲染由
SDL_CreateRenderer函数声明。 它有3个值:一个将使用此渲染的窗口,一个驱动程序索引(如果希望找到第一个合适的窗口,则为-1)和标志。 我使用了标志
SDL_RENDERER_ACCELERATED和
SDL_RENDERER_PRESENTVSYNC 。 这是所有标志的列表:
标志SDL_RENDERER_SOFTWARE-后备;
SDL_RENDERER_ACCELERATED-使用硬件加速;
SDL_RENDERER_PRESENTVSYNC-垂直同步;
SDL_RENDERER_TARGETTEXTURE-支持渲染到纹理。
接下来,我们使用
SDL_SetRenderDrawColor函数,该函数设置绘图基元的颜色。
之后,初始化
IMG并返回
ok 。
int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; }
现在我们编写
Load函数。
bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; }
在这里,我们还为相同的需求创建了
ok变量。 他们创建了一个临时表面并将花朵图像加载到其中。
接下来,我们需要从表面制作纹理。
flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; }
函数
SDL_CreateTextureFromSurface将帮助我们创建纹理。 它具有渲染值和表面值。 它返回
SDL_Texture类的实例。
为了不阻塞内存,我们需要清洁临时表面。 之后,返回
确定 ,函数准备就绪。
退出功能已采取了其他一些措施。
void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); }
在这里,我们删除了窗口,渲染,纹理,并保留了
SDL和
IMG 。 我还将所有已删除的对象设置为
NULL ,以实现更好的内存清理。
我们开始编写
Main函数。
int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; }
我们编写了初始化和加载,我们不止于此。
下一步是创建2个变量。
bool run = true; SDL_Event e;
该程序将具有刷新内存的主要周期,因此让我们开始对其进行重写。
while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } }
处理了按下十字架的事件,仅此而已。
该画画了。 使用纹理和渲染时,将使用我们已知的不同功能进行渲染。 为了清除绘制纹理的屏幕,使用了
SDL_RenderClear函数。 它使用我们用
SDL_SetRenderDrawColor函数指定的颜色来绘制屏幕。 函数SDL_RenderCopy
用于渲染纹理,而SDL_RenderPresent
用于更新屏幕。 我们现在就写它们。
SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); }
我们将仅
分析SDL_RenderCopy函数。 它有4个含义。 第一个是渲染,第二个是纹理,第三个是我们要剪切以进行渲染的矩形区域,第四个是其坐标用于渲染的矩形,宽度和高度用于调整纹理的大小。
接下来,调用
Quit函数并返回
0 。
quit(); return 0; }
如果不清楚,我将在此完成本课程,请写下,然后我再见,再见!
顺便说一下,这是完整的代码:
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; } bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; } SDL_FreeSurface(temp_surf); return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } bool run = true; SDL_Event e; while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } } SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); } quit(); return 0; }
←上一课| 下一课
→