Всем привет, это шестой урок по SDL 2 и он вышел маленьким, но его стоит пройти. Все уроки находятся здесь.
На этом уроке разберем рисование примитивов. Давайте же начнем и добро пожаловать на урок
Сначала разберем, что же такое примитив. Графический примитив — это простейший геометрический объект, отображаемый на экране дисплея: точка, отрезок прямой, прямоугольник, дуга, окружность и т. д. В SDL 2 мы можем рисовать только точки, прямоугольники и линии.
Давайте уже приступим к коду
Объявление переменных я описывать не буду, идем дальше.
В Init инициализируем SDL 2, создаем окно и рендер тут тоже не задерживаемся.
Функцию Load я не пишу, так как загружать нам ничего не нужно.
В функции Quit просто удаляем окно, рендер и разынициализируем SDL 2.
Вызов функции Init я пропущу, перейдем к самому интересному. Для того, чтобы нарисовать прямоугольник, нам нужно оздать объект типа SDL_Rect. Его координаты и размеры нужны для рисования.
Немного об SDL_Rect: этот тип данных представляет из себя массив из 4-х чисел: x, y, w и h — в таком порядке. То есть вот такой код: SDL_Rect rect = {1, 1, 1, 1}; — в полне корректный.
На этом теория про SDL_Rect закончена, приступим к написанию кода.
Здесь мы рендеру сказали рисовать черным цветом и залить им всё окно. После этого сказали рисовать белым цветом. Далее создали прямоугольник с координатами (10; 10) и размерами 50х50. Функция SDL_RenderFillRect рисует прямоугольник.
Рисование только контура прямоугольника мало чем отличается.
Мы создали прямоугольник и вызвали функцию SDL_RenderDrawRect. Она на экране рисует только контур прямоугольника.
Следующим шагом нарисуем линию.
Для рисования линии прямоугольник не нужен. Функция SDL_RenderDrawLine принимает значения рендера и четырех координат. Это координаты точки начала и точки конца. Я решил нарисовать горизонтальную линию с отступом от краев на 10 пикселей.
Рисование точек почти ничем не отличется от рисования линий. Мы вызываем функцию SDL_RenderDrawPoint и внее передаем рендер и координаты точки. Но просто точку нарисовать не интересно, давайте лучше напишемfor, в котором через 3 пикселя будем рисовать точки.
У нас получилась горизонтальная пунктирная линия из точек.
На этом рисование закочилось. Осталось только обновить экран, поставить время паузы, выйти и вернуть 0.
На этом наш урок закончен, вот вам полный код:
А я с вами прощаюсь, всем пока!
<< Предыдущий урок
На этом уроке разберем рисование примитивов. Давайте же начнем и добро пожаловать на урок
Примитивы
Сначала разберем, что же такое примитив. Графический примитив — это простейший геометрический объект, отображаемый на экране дисплея: точка, отрезок прямой, прямоугольник, дуга, окружность и т. д. В 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) и размерами 50х50. Функция 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 и внее передаем рендер и координаты точки. Но просто точку нарисовать не интересно, давайте лучше напишемfor, в котором через 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;
}
А я с вами прощаюсь, всем пока!
<< Предыдущий урок