SDL 2教程:第5课-纹理

大家好,欢迎来到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_ACCELERATEDSDL_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(); } 

在这里,我们删除了窗口,渲染,纹理,并保留了SDLIMG 。 我还将所有已删除的对象设置为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; } 

上一课| 下一课

Source: https://habr.com/ru/post/zh-CN456798/


All Articles