Шрифты 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();
}