大家好,这是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个数字的数组:
x ,
y ,
w和
h-按此顺序。 也就是说,此代码:
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; }
我跟你说再见,再见!
<<上一课|| 下一课
>>