Уроки по 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-х чисел: 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

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое