Шрифты True Type


Пришло время научится рендерить текст. SDL не поддерживает *.ttf нативно, так что нам понадобится расширение SDL_ttf. Оно позволяет создавать поверхности из шрифтов True Type.

Вы можете скачать SDL_ttf здесь.

Для установки расширения, вы можете воспользоваться моей инструкцией. Установка SDL_ttf выполняется очень похоже на установку SDL_image.

Пользователем *nix систем возможно придется линковать приложение с freetype.

Этот туториал раскрывает основы использования SDL_ttf.

//Поверхности
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
SDL_Surface *screen = NULL;
//Структура события
SDL_Event event;
//Шрифт, который мы будем использовать
TTF_Font *font = NULL;
//Цвет шрифта
SDL_Color textColor = { 255, 255, 255 };

Объявляем переменные. Тут у нас поверхности фона и экрана, а так же структура событий, как и раньше. Так же у нас есть поверхность message, которая будет содержать поверхность с текстом.

Новый тип данных TTF_Font определяет шрифт, который мы будем использовать. Плюс структура SDL_Color определяющая цвет текста для рендеринга. В нашем случае цвет — белый.

Если вы хотите больше узнать про тип данных SDL_Color, можете посмотреть о нем в документации SDL.

bool init() {
    //Инициализировать все подсистемы SDL
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) {
        return false;
    }
    //Подготовить экран
    screen = SDL_SetVideoMode(
        SCREEN_WIDTH,
        SCREEN_HEIGHT,
        SCREEN_BPP,
        SDL_SWSURFACE
    );
    //Если при подготовке экрана произошла ошибка
    if( screen == NULL ) {
        return false;
    }
    //Инициализировать SDL_ttf
    if( TTF_Init() == -1 ) {
        return false;
    }
    //Установить заголовок окна
    SDL_WM_SetCaption( "TTF Test", NULL );
    //Если все прошло хорошо
    return true;
}

Это наша функция инициализации. Все тоже самое что и раньше, только в этот раз мы дополнительно инициализируем SDL_ttf
SDL_ttf инициализируется вызовом TTF_Init(). TTF_Init() возвращает -1 в случае ошибки.
TTF_Init() должна быть вызвана до использованию любой другой функции SDL_ttf.

bool load_files() {
    //Загрузить фоновое изображение
    background = load_image( "background.png" );
    //Открыть шрифт
    font = TTF_OpenFont( "lazy.ttf", 28 );
    //В случае проблем с загрузкой фона
    if( background == NULL ) {
        return false;
    }
    //При ошибке загрузки шрифта
    if( font == NULL ) {
        return false;
    }
    //Если все загрузилось
    return true;
}

Это наша функция загрузки файлов. Для загрузки *.ttf шрифта нужно вызвать TTF_OpenFont().

Первый аргумент TTF_OpenFont() это имя *.ttf файла, который вы хотите открыть. Второй аргумент — размер который вы хотите установить открываемому шрифту.

В случае ошибки при загрузки шрифта, TTF_OpenFont() вернет NULL.

    //Отрендерить текст
    message = TTF_RenderText_Solid(
        font,
        "The quick brown fox jumps over the lazy dog",
        textColor
    );
    //При ошибке рендера
    if( message == NULL ) {
        return 1;
    }
    //Скопировать изображения на экран
    apply_surface( 0, 0, background, screen );
    apply_surface( 0, 150, message, screen );
    //Обновить экран
    if( SDL_Flip( screen ) == -1 ) {
       return 1;
    }

Это код рендеринга внутри функции main().

Быстрейший путь отрендерить текст это использовать функцию TTF_RenderText_Solid().

TTF_RenderText_Solid() принимает шрифт в качестве первого аргумента и создает поверхность с текстом из второго аргумента и цветом из третьего. TTF_RenderText_Solid() возвращает NULL в случае ошибки.

Существуют и другие способы рендеринга текста, проверьте их в документации SDL_ttf.
Для некоторых пользователей Линукса TTF_RenderText_Solid() не сработает. В этом случае убедитесь что у вас используется последняя версия библиотеки freetype (библиотека на которой основана SDL_ttf) и сама SDL_ttf. Если это не помогло, попробуйте использовать TTF_RenderText_Shaded() вместо TTF_RenderText_Solid().

void clean_up() {
    //Освободить поверхности
    SDL_FreeSurface( background );
    SDL_FreeSurface( message );
    //Закрыть использованный шрифт
    TTF_CloseFont( font );
    //Завершить SDL_ttf
    TTF_Quit();
    //Завершить SDL
    SDL_Quit();
}

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

Мы также закрываем открытый шрифт при помощи TTF_CloseFont() и затем завершаем работу SDL_ttf при помощи TTF_Quit().

После этого мы как обычно завершаем работу SDL.


Скачать исходники и материалы

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