Вывод на экран первого изображения

Hello worldЭто часть руководства о том, как написать Hello World в стиле SDL.

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

//Подключить описания функция и типов данных SDL
#include <SDL/SDL.h>

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

Обращаю ваше внимание на то, что некоторым из вас (например тем кто использует Visual Studio) необходимо подключать заголовок SDL. Например так:

#include "SDL.h"

Так что если компилятор жалуется на то, что он не может найти <SDL/SDL.h>, то либо вы подключаете файл по неправильному пути, либо вы забыли положить SDL.h в нужное место.

int main( int argc, char* args[] )
{
    //Изображения
    SDL_Surface* hello = NULL;
    SDL_Surface* screen = NULL;

В начале функции main(), мы объявляем два указателя на структуры SDL_Surface. SDL_Surface это изображение, и в этом приложении мы собираемся иметь дело с двумя изображениями. Поверхность(surface) «hello» это изображение, которое мы собираемся загружать и отображать. «screen» это то, что будет видно на экране.

Когда вы имеете дело с указателями, вы всегда должны их инициализировать.

Также, когда вы работаете с SDL, вы должны объявлять вашу функцию main() таким же образом как в коде выше. Вы не можете использовать void main()target="_blank" или что-то подобное.

    //Инициализировать SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Настроить экран
    screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    //Загрузить изображение
    hello = SDL_LoadBMP( "hello.bmp" );

Первая функция, которую мы вызываем в main это SDL_Init(). Вызов SDL_Init() инициализирует все подсистемы SDL, поэтому мы можем начать использовать графические функции SDL.

Дальше мы вызываем SDL_SetVideoMode(), которая устанавливает ширину окна в 640 пикселей, высоту в 480 и глубину цвета в 32 бита на пиксель. Последний аргумент(SDL_SWSURFACE) располагает поверхность в программной памяти. Вызов SDL_SetVideoMode() возвращает указатель на поверхность окна, так что мы теперь можем ее использовать.

После того как окно настроено, мы загружаем наше изображений при помощи SDL_LoadBMP(). SDL_LoadBMP() принимает в качестве аргумента путь к растровому изображению (bitmap) и возвращает указатель на загруженную SDL_Surface. В случае ошибки загрузки эта функци вернет NULL.

    //Вывести изображение на экран
    SDL_BlitSurface( hello, NULL, screen, NULL );
    //Обновить экран
    SDL_Flip( screen );
    //Пауза
    SDL_Delay( 2000 );

Теперь, когда мы настроили наше окно и загрузили изображение, мы хотим вывести загруженное изображение на экран. Мы делаем это при помощи функции SDL_BlitSurface().
Первый аргумент SDL_BlitSurface() это поверхность, которую мы хотим вывести (source, источник). Третий аргумент это поверхность, на которую мы хотим вывести наше изображение (destination, назначение). SDL_BlitSurface() помещает поверхность источника на поверхность назначения. В нашем случае она собирается вывести наше загруженное изображение на экран. О втором аргументе будет рассказано в последующих частях руководства.

Теперь, когда наше изображение расположено на экране, нам нужно обновить экран, чтобы мы могли его увидеть. Мы делаем это используя SDL_Flip(). Если вы не вызовите SDL_Flip(), все что вы увидете это черный не обновленный экран.

Теперь когда изображение выведено на экран и сделано видимым, нам нужно сделать так, чтобы окно оставалось видимым некоторое время, а не просто моргнуло на мгновение и исчезло. Мы добьемся этого вызовом SDL_Delay(). Здесь мы делаем задержку на 2000 миллисекунд(2 секунды). Более хороший способ заставить окно оставаться на месте мы узнаем в четвертой части руководства.

    //Освободить память из-под загруженного изображения
    SDL_FreeSurface( hello );
    //Освободить ресурсы занятые SDL
    SDL_Quit();
    return 0;
}

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

Вы возможно хотите узнать, почему мы не удаляем поверхность экрана(screen). Не волнуйтесь. SDL_Quit() удалит ее за нас.

Поздравляю! Вы только написали ваше первое графическое приложение.


Скачать исходники

Добавить комментарий