Всем привет, это шестой урок по 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) и размерами 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;
}

А я с вами прощаюсь, всем пока!

<< Предыдущий урок

Комментарии (0)