大家好! 我为您提供了新课程! 而且,如果您突然厌倦了等待我的课程,可以在
这里始终以英语查找这些课程。
好吧,让我们从标题开始第七课
视口是从英语翻译成的观看位置,在我们的情况下,它是渲染位置。 本质是这样的:我们将绘图表面并不仅限于整个窗口,而是限于其中的一部分。 例如,这对于在游戏中绘制小地图很有用。
根据理论,我拥有一切,我们转向实践。
#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秒钟并结束程序。
编译并运行该程序后,我们将看到两朵扁平的花。 这就是我今天想展示的。
好吧,这是一小节课,如果您有任何疑问,我将很乐于解释,但我拥有一切。 再见!
<<上一课