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

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

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

Цель данных уроков — познакомить вас с основами SDL 2.0 и гейм-дева на С . Подразумевается, что у читателя есть определенный навык программирования на С и минимальные познания массивов, векторов, руководящих конструкций, функций и указателей.

Если вы испытываете сложности при разборе кода в примерах, воспользуйтесь одной из книг, представленных в этом Удивительном списке на StackOverflow.

Если вы хотите увидеть полный исходник либо же скачать источники для уроков, то все это дозволено получить на GitHub’е. Но не копируйте!

Также документация по SDL 2.0 доступна для чтения в этой вики.

Урок 1: Hello World!

В этом уроке мы обучимся открывать окно, создавать контекст рендеринга и рисовать загруженное изображение на экране. Ниже вы можете забрать BMP картинку, которую мы будем рисовать. Сбережете ее где-нибудь в своем плане. Так давайте теснее начнем!

image

Запуск SDL

1-й шаг обыкновенно заключается в подключении заголовочного файла SDL.

#include "SDL.h"

Примите к сведению, что в зависимости от конфигурации SDL вам (Linux пользователям, если быть определенным) может понадобиться сделать так:

#include "SDL/SDL.h"
//or
#include "SDL2/SDL.h"
//depending on your configuration

Для того, Дабы применять SDL, нам нужно инициализировать разные SDL подсистемы, которые мы хотим применять. Это дозволено сделать с поддержкой функции SDL_Init, которая принимает комплект флагов, указывающих, какие подсистемы мы хотим инициализировать. Теперь мы легко скажем, что хотим инициализировать все, но если хотите, вы можете это изменить. Минимум, что нужно для нашего урока — это SDL_INIT_VIDEO. Если все пройдет удачно, SDL_Init вернет 0, в отвратном случае мы хотим напечатать ошибку и выйти.

Заметка для пользователей Visual Studio: если вы установили значение системы как Windows в настройках компоновщика, то вы не получите типовой итог в консоль. Дабы этого не случилось, вам нужно изменить значение системы на Console.

if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
	std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
	return 1;
}
Открытие окна

Нам необходимо окно, Дабы дозволено было в нем отображать на рендер. Мы можем сделать его, применяя функцию SDL_CreateWindow, которая принимает наименование окна, его координаты, высоту, ширину и некоторые флаги, Дабы задать параметры окна. Данная функция возвращает SDL_Window*. Данный указатель будет NULL, если что-нибудь пойдет не так при создании окна.

SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
if (win == nullptr){
	std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
	return 1;
}
Создание рендерера

Сейчас мы можем сделать рендерер, с поддержкой SDL_CreateRenderer. Это нужно для того, Дабы получить вероятность рисовать в окне. Данная функция принимает указатель на окно, с которым нужно ассоциировать рендерер, индекс драйвера, тот, что будет применяться для рендеринга (либо -1, Дабы предпочесть 1-й подходящий под наши требования) и разные флаги, использующие для указания типа рендерера, тот, что нам необходим. В данном случае мы запрашиваем рендерер с аппаратным убыстрением и включенной вертикальной синхронизацией. Мы получим SDL_Renderer*, тот, что будет NULL, если что-то вульгарно не так.

SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == nullptr){
	std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
	return 1;
}
Загрузка BMP изображения

Для того, Дабы отрендерить BMP картинку, нам нужно вначале загрузить ее в память, а после этого в устройство рендеринга, которое мы используем (в данном случае GPU). Мы можем загрузить изображение с поддержкой SDL_LoadBMP. Эта функция возвращает SDL_Surface*, которую мы можем загрузить вSDL_Texture, Дабы ей мог воспользоваться рендерер.

SDL_LoadBMP принимает путь к нашему изображению, тот, что вы обязаны изменить, Дабы он соответствовал структуре вашего плана, и возвращает SDL_Surface* либо NULL, в случае ошибки.

SDL_Surface *bmp = SDL_LoadBMP("../res/Lesson1/hello.bmp");
if (bmp == nullptr){
	std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
	return 1;
}

Сейчас мы можем загрузить изображение в рендерер, применяя SDL_CreateTextureFromSurface. Мы передаем контекст рендеринга и картинку в памяти (SDL_Surface), а получаем загруженную текстуру. В случае, если что-то вульгарно не так, мы получим NULL. Также SDL_Surface нам огромнее не понадобится, следственно мы освободим занимаемую ей память.

SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
SDL_FreeSurface(bmp);
if (tex == nullptr){
	std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
	return 1;
}
Отрисовка текстуры

Все, что осталось сделать, это получить нашу текстуру на экране! Сперва мы очистим рендерер, позжеотрендерим текстуру, а после этого покажем обновленный экран, Дабы увидеть итог. Так как мы хотим отрендерить изображение целиком и принудить его растянутся по размеру экрана, мы передадим NULL как начальный и целевой прямоугольники для SDL_RenderCopy. Также мы хотим сберечь окно открытым на некоторое время, Дабы увидеть итог до заключения программы, следственно мы добавим вызов SDL_Delay.

SDL_RenderClear(ren);
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderPresent(ren);

SDL_Delay(2000);
Уборка мусора

Перед тем, как выйти, мы обязаны истребить все сделанные нами объекты с поддержкой разных SDL_DestroyX функций и закончить SDL.

SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
Конец урока

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

До скорой встречи в уроке 2: не запихивайте все в main.

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

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