Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Цикл уроков по SDL 2.0: урок 2

Anna | 24.06.2014 | нет комментариев

Сегодня мы начнем рефакторить код с прошлого урока, дописав несколько дюже пригодных функций, а также разберем то, как изображения позиционируются и масштабируются в SDL_Window.

Как традиционно, мы начнем программу со включения SDL. Также в данном уроке мы будем применять класс string, следственно подключим и его.

#include "SDL.h"
#include <string>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr;

Также мы объявим пару константных значений для ширины и высоты экрана, совместно с глобальными объявлениями окна и рендерера, Дабы они были доступны из наших функций. Вновь мы инициализируем указатели как nullptr для безопасности. Если вы не используете C 11, инициализируйте их как NULL.

Примечание: вы обязаны усердствовать чураться применения не константных глобальных значений, либо глобальных значений в всеобщем, то есть вы никогда не обязаны объявлять всеобщий SDL_Window либо SDL_Renderer. Впрочем, для этого простого урока мы все же воспользуемся ими. Мы разглядим использование глобальных объектов через несколько уроков.

Помните, как мы в первом уроке загружали текстуру? Не так нехорошо загружать в main’е одну текстуру, но представьте, если бы их было пару сотен? Нам пришлось бы печатать один и тот же кусок кода всякий раз! Гораздо отменнее объявить функцию для загрузки текстур по имени файла:

SDL_Texture* LoadImage(std::string file){
   SDL_Surface *loadedImage = nullptr;
   SDL_Texture *texture = nullptr;
    loadedImage = SDL_LoadBMP(file.c_str());
   if (loadedImage != nullptr){
       texture = SDL_CreateTextureFromSurface(renderer, loadedImage);
       SDL_FreeSurface(loadedImage);
   }
   else
       std::cout << SDL_GetError() << std::endl;
   return texture;
}

Эта функция должна выглядеть дюже знакомо, чай данный тот же самый код, что мы писали в первом уроке, но сейчас он объединен в отменную функцию. С ее поддержкой мы можем передать имя файла как строчку и получить указатель на загруженную текстуру. Подметьте, что указатель будет nullptr, если загрузка не удастся.

Дальше мы хотим написать функцию, Дабы упростить рисование. Также эта функция дозволит указывать позицию изображения на экране. Она будет принимать x и y координаты, указатели на текстуру и рендерер и рисовать текстуру в указанной точке.

void ApplySurface(int x, int y, SDL_Texture *tex, SDL_Renderer *rend){
   SDL_Rect pos;
   pos.x = x;
   pos.y = y;
   SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
   SDL_RenderCopy(rend, tex, NULL, &pos);
}

Дабы указать, где будет рисоваться текстура, нам нужно сделать SDL_Rect, адрес которого мы передадим SDL_RenderCopy в качестве параметра целевого прямоугольника.

Для того, Дабы сделать наш прямоугольник, мы возьмем x и y, которые были переданы, и присвоим соответствующим значениям прямоугольника их значения. Впрочем, нам также нужно указать ширину и высоту, чай SDL 2.0 разрешает нам масштабировать текстуры. Испробуйте поиграться со значениями ширины и высоты и посмотрите, что получится!

Теперь же мы легко передадим ширину и высоту текстуры, Дабы нарисовать ее в масштабе 1:1. Эти значения мы можем получить, применяя функцию SDL_QueryTexture. Она принимает указатель на текстуру, следующие два параметра укажем как NULL (эти параметры отвечают за формат и ярус доступа, которые нам не необходимы). И наконец, мы обязаны передать адреса переменных, которые функция заполнит шириной и высотой текстуры.

Сейчас, когда мы получили инициализированный SDL_Rect, его дозволено передать в SDL_RenderCopy, Дабы текстура была нарисована в требуемой нам точке с подлинными высотой и шириной. Оставшийся NULL параметр, переданный этой функции отвечает за вырезание фрагмента начальной текстуры. Его применение мы разберем позже.

Давайте же увидим наши функции в действии. Для начала, запустим SDL и сделаем окно и рендерер, как в прошлый раз. Но у нас возникло здесь кое-что новенькое, а именно SDL_WINDOWPOS_CENTERED. Эта опция разрешает при создании окна отцентровать его по опредs_lqvmk!br/>

Конец урока

Вот и подошел к своему заключению сегодняшний урок. Каждому до встречи в уроке 3: внешние библиотеки SDL.

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB