Всем привет! Я вернулся с новым уроком для вас! А если вам вдруг надоест ждать урока от меня, вы всегда сможете найти эти уроки на английском здесь.
Что ж, давайте начнем 7-й по счету уроку с названием
Viewport с английского переводиться как место просмотра, или же в нашем случае — это место отрисовки. Суть такая: мы берем и ограничиваем поверхность рисования не всем окном, а какой-то его частью. Это может пригодиться, например, для рисования миникарты в игре.
По теории у меня всё, переходим к практике.
Для начала, как всегда объявляем переменные.
Рисовать будем этот цветочек.
Функции инициализации, загрузки изображения и разынициализации я описывать не буду, так как они почти идентичны с теми, что были ранее.
А теперь переходим к самому интересному:
Здесь мы подключили SDL, загрузили картинку и создали два прямоугольника, которые находятся один под другим и занимают всю ширину окна. Это будут наши viewportы.
Далее мы уже начинаем рисовать. Первым делом нам нужно установить место рисования. Делается это функцией SDL_RenderSetViewport, которая принимает два параметра: рендер и прямоугольник, в котором мы хотели бы рисовать. После установки области, отрисовываем в ней наш цветочек уже известным методом SDL_RenderCopy. После этого повторяем тоже самое для второго прямоугольника.
Дальше обновляем окно, ждем 2 секунды и заканчиваем программу.
После компиляции и запуска этой программы мы увидим два сплюснутых цветка. Это все, что я хотел сегодня показать.
Что ж, вот такой небольшой получился урок, если появятся какие-нибудь вопросы, буду рад объяснить, а у меня все. До свидания!
<< Предыдущий урок
Что ж, давайте начнем 7-й по счету уроку с названием
Viewport
Viewport с английского переводиться как место просмотра, или же в нашем случае — это место отрисовки. Суть такая: мы берем и ограничиваем поверхность рисования не всем окном, а какой-то его частью. Это может пригодиться, например, для рисования миникарты в игре.
По теории у меня всё, переходим к практике.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
using namespace std;
const int SCREEN_SIZE[2] = {640, 480};
SDL_Window *window = NULL;
SDL_Renderer *ren = NULL;
SDL_Texture *flower = NULL;
Для начала, как всегда объявляем переменные.
Рисовать будем этот цветочек.
init
bool init() {
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) {
cout << "Can't init SDL: " << SDL_GetError() << endl;
return false;
}
int flags = IMG_INIT_PNG;
if (!(IMG_Init(flags)&flags)) {
cout << "Can't init IMG: " << IMG_GetError() << endl;
return false;
}
window = SDL_CreateWindow("VIEWPORT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_SIZE[0], SCREEN_SIZE[1], SDL_WINDOW_SHOWN);
if (window == NULL) {
cout << "Can't create window: " << SDL_GetError() <<endl;
return false;
}
ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == NULL) {
cout << "Can't create renderer: " << SDL_GetError() <<endl;
return false;
}
return true;
}
load
bool load() {
SDL_Surface *temp_surf = NULL;
temp_surf = IMG_Load("flower.png");
if (temp_surf == NULL) {
cout << "Can't load image: " << IMG_GetError() << endl;
return false;
}
flower = SDL_CreateTextureFromSurface(ren, temp_surf);
if (flower == NULL) {
cout << "Can't create texture from surface: " << SDL_GetError() << endl;
SDL_FreeSurface(temp_surf);
temp_surf = NULL;
return false;
}
return true;
}
quit
void quit() {
SDL_DestroyWindow(window);
window = NULL;
SDL_DestroyRenderer(ren);
ren = NULL;
SDL_DestroyTexture(flower);
flower = NULL;
SDL_Quit();
IMG_Quit();
}
Функции инициализации, загрузки изображения и разынициализации я описывать не буду, так как они почти идентичны с теми, что были ранее.
А теперь переходим к самому интересному:
int main() {
if (!init()) {
quit();
return 1;
}
if (!load()) {
quit();
return 1;
}
SDL_Rect top_vp = {0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2};
SDL_Rect bottom_vp = {0, SCREEN_SIZE[1] / 2, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2};
Здесь мы подключили SDL, загрузили картинку и создали два прямоугольника, которые находятся один под другим и занимают всю ширину окна. Это будут наши viewportы.
SDL_RenderSetViewport(ren, &top_vp);
SDL_RenderCopy(ren, flower, NULL, NULL);
SDL_RenderSetViewport(ren, &bottom_vp);
SDL_RenderCopy(ren, flower, NULL, NULL);
Далее мы уже начинаем рисовать. Первым делом нам нужно установить место рисования. Делается это функцией SDL_RenderSetViewport, которая принимает два параметра: рендер и прямоугольник, в котором мы хотели бы рисовать. После установки области, отрисовываем в ней наш цветочек уже известным методом SDL_RenderCopy. После этого повторяем тоже самое для второго прямоугольника.
SDL_RenderPresent(ren);
SDL_Delay(2000);
quit();
return 0;
}
Дальше обновляем окно, ждем 2 секунды и заканчиваем программу.
После компиляции и запуска этой программы мы увидим два сплюснутых цветка. Это все, что я хотел сегодня показать.
Что ж, вот такой небольшой получился урок, если появятся какие-нибудь вопросы, буду рад объяснить, а у меня все. До свидания!
<< Предыдущий урок