SDL 2教程:第7课-视口

大家好! 我为您提供了新课程! 而且,如果您突然厌倦了等待我的课程,可以在这里始终以英语查找这些课程。

好吧,让我们从标题开始第七课

视口


视口是从英语翻译成的观看位置,在我们的情况下,它是渲染位置。 本质是这样的:我们将绘图表面并不仅限于整个窗口,而是限于其中的一部分。 例如,这对于在游戏中绘制小地图很有用。

根据理论,我拥有一切,我们转向实践。

#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; const int SCREEN_SIZE[2] = {640, 480}; SDL_Window *window = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; 

对于初学者,一如既往地声明变量。

我们将画这朵花。

图片

初始化
 bool init() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; return false; } int flags = IMG_INIT_PNG; if (!(IMG_Init(flags)&flags)) { cout << "Can't init IMG: " << IMG_GetError() << endl; return false; } window = SDL_CreateWindow("VIEWPORT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_SIZE[0], SCREEN_SIZE[1], SDL_WINDOW_SHOWN); if (window == NULL) { cout << "Can't create window: " << SDL_GetError() <<endl; return false; } ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() <<endl; return false; } return true; } 


负荷
 bool load() { SDL_Surface *temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; return false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; SDL_FreeSurface(temp_surf); temp_surf = NULL; return false; } return true; } 


退出
 void quit() { SDL_DestroyWindow(window); window = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } 


我将不描述初始化,图像加载和取消初始化的功能,因为它们几乎与以前的功能相同。

现在,有趣的部分是:

 int main() { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } SDL_Rect top_vp = {0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; SDL_Rect bottom_vp = {0, SCREEN_SIZE[1] / 2, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; 

在这里,我们插入了一个SDL ,上传了图片,并创建了两个矩形,两个矩形一个在另一个下方,并占据了整个窗口的宽度。 这些是我们的视口

  SDL_RenderSetViewport(ren, &top_vp); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderSetViewport(ren, &bottom_vp); SDL_RenderCopy(ren, flower, NULL, NULL); 

接下来,我们已经开始绘制。 首先,我们需要确定绘图位置。 这是由SDL_RenderSetViewport函数完成的,该函数具有两个参数:render和我们要在其中绘制的矩形。 设置区域后,使用众所周知的SDL_RenderCopy方法在其中绘制花朵。 之后,对第二个矩形重复相同的操作。

  SDL_RenderPresent(ren); SDL_Delay(2000); quit(); return 0; } 

然后,我们更新窗口,等待2秒钟并结束程序。

编译并运行该程序后,我们将看到两朵扁平的花。 这就是我今天想展示的。

好吧,这是一小节课,如果您有任何疑问,我将很乐于解释,但我拥有一切。 再见!

<<上一课

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


All Articles