SDL 2课:第6课-原语

大家好,这是SDL 2的第六课,虽然很小,但是值得一读。 所有的课程都在这里

在本课程中,我们将绘制图元的图。 让我们开始吧,欢迎上课

原语


首先,让我们看看什么是原始元素。 图形基元是显示在屏幕上的最简单的几何对象:点,线段,矩形,圆弧,圆等。在SDL 2中,我们只能绘制点,矩形和线。

让我们开始编写代码

#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; 

我不会描述变量的声明,让我们继续。

 bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; } 

Init中,初始化SDL 2,创建一个窗口并在此处渲染,不要拖延。

我不编写Load函数,因为我们不需要加载任何东西。

Quit函数中,我们只需删除窗口,渲染并取消初始化SDL 2。

 void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; } 

我将跳过对Init函数的调用,然后转到最有趣的部分。 为了绘制矩形,我们需要创建一个SDL_Rect类型的对象。 绘制时需要其坐标和尺寸。

关于SDL_Rect的一些知识 :此数据类型是4个数字的数组: xywh-按此顺序。 也就是说,此代码: SDL_Rect rect = {1,1,1,1}; -完全正确。

这就完成了有关SDL_Rect的理论,让我们开始编写代码。

  SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1); 

在这里,我们被告知渲染器用黑色绘制并用整个窗口填充它们。 之后,他们说要涂成白色。 接下来,我们创建了一个矩形,其坐标为(10; 10),尺寸为50x50。 SDL_RenderFillRect函数绘制一个矩形。

仅绘制矩形的轮廓没有太大区别。

  SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2); 

我们创建了一个矩形,并将其称为SDL_RenderDrawRect函数。 她只在屏幕上绘制矩形的轮廓。

下一步是画一条线。

  SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70); 

不需要矩形来画一条线。 SDL_RenderDrawLine函数接受渲染值和四个坐标。 这些是起点和终点的坐标。 我决定画一条​​从边缘缩进10像素的水平线。

绘图点与绘图线几乎没有什么不同。 我们调用SDL_RenderDrawPoint函数,并传入点的渲染和坐标。 但是仅画一点并不有趣,让我们写得更好一些,在其中我们将通过3个像素画点。

  for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); } 

我们得到了点的水平虚线。

在此绘图上已停止。 它仅用于更新屏幕,设置暂停时间,退出并返回0

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

我们的课程到此结束,下面是完整的代码:

 #include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; } int main (int arhc, char ** argv) { if (!init()) { quit(); system("pause"); return 1; } SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1); SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2); SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70); for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); } SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; } 

我跟你说再见,再见!

<<上一课|| 下一课>>

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


All Articles