Дополнение к уроку 3 | Содержание | Урок 5 |
char *
в последовательность из спрайтов. Можно сделать последовательность символов в исходном рисунке в соответствии со стандартной кодовой таблицей (например ASCII или KOI8-R): номер кадра с символом равен соответствующему коду этого символа. Это самый простой пример создаиня своего механизма печати. Я пересмотрел несколько подобных механизмов, некоторые были гораздо изощреннее и богаче по возможностям. Возможно этот метод пригодится, когда нужно использовать уникальный шрифт в какой-нибудь игре. Теперь давайте попробуем сделать простую функцию для вывода текста с помощью растрового шрифта, т.е. шрифт, который находится в файле изображении.#include "SDL_image.h"
и при линковке указать библиотеку: -lSDL_image. Эта библиотека очень простая в использовании. Справки с ней не прилагается, но в файле заголовков очень понятные комментарии. И так, что же она нам дает. Как я уже упоминал в предыдущих уроках, штатными средствами SDL мы можем загружать только файлы BMP. Но при помощи SDL_image мы можем работать с практически любым форматом изображения. Файл нашего растрового шрифта имеет формат PNG (Portable Network Graphics). Чтобы загрузить такой файл мы используем функцию IMG_Load
из библиотеки SDL_image. Вот ее прототип: SDL_Surface* IMG_Load(const char* file);
SDL_Surface
любую графику. И давайте посмотрим на функцию загрузки шрифта:
/* ------------------------------------------------------ */ SDL_Surface* LoadFont(char* BitmapFont){ SDL_Surface* temp; temp = IMG_Load(BitmapFont); if(temp == NULL){ printf("Can't load image %s\n",BitmapFont); return NULL; } SDL_SetColorKey(temp,SDL_SRCCOLORKEY,SDL_MapRGB(temp->format,255,255,255)); return temp; } |
Как вы уже заметили, буквы в нашем шрифте идут по алфавитному порядку. И вот почему. В большинстве кодовых таблиц первые 128 символов занимают латинские буквы и стандартные и уравляющие символы. Остальные 128 используются для локализации, то есть содержат символы других языков. Вот кусок из кодовой таблицы KOI8-R: |
/* ------------------------------------------------------ */ void DrawText(SDL_Surface* sFont, int x, int y, char * str){ int i; SDL_Rect src, dest; for (i = 0; i < strlen(str); i++) { if (str[i] >= 'A' && str[i] <= 'Z') { src.x = (str[i] - 'A') * 32; src.y = 0; src.w = 32; src.h = 32; dest.x = x + (i * 32); dest.y = y; dest.w = 32; dest.h = 32; SDL_BlitSurface(sFont, &src, screen, &dest); } } SDL_Flip(screen); } |
for (i = 0; i < strlen(str); i++)
if (str[i] >= 'A' && str[i] <= 'Z')
(str[i] -'A') * 32;
вычисляет эту координату. Допустим у нас символ B (код 66), тогда получаем: (66-65)*32 = 32. То есть начинаем вырезать букву B в координатах x=32, y=0. Для выходных координат ( в которые выводить текст) рассчитываем позицию каждого следующего символа:x + (i * 32);
и поскольку индекс i самого первого символа равен нулю, то первый символ будет выведен в тех координатах, что поступают как аргументы.
SDL_Surface* sFont; sFont = LoadFont("font.png"); DrawText(sFont, 20, 150, "BITMAP FONT EXAMPLE"); |
#include "SDL_ttf.h"
и указать библиотеку для линковки: -lSDL_ttf. Вот и все подготовительные процедуры. Ну что ж, давайте попробуем наваять небольшой пример, чтобы убедиться, какая же простая эта библиотека.
TTF_Init();
atexit(TTF_Quit);
TTF_Quit()
перед выходом из программы. Теперь посмотрите на код функции для вывода текста. Это очень просто.
/* ------------------------------------------------------ */ void print_ttf(SDL_Surface *sDest, char* message, char* font, int size, SDL_Color color, SDL_Rect dest){ TTF_Font *fnt = TTF_OpenFont(font, size); SDL_Surface *sText = TTF_RenderText_Blended( fnt, message, color); SDL_BlitSurface( sText,NULL, sDest,&dest ); SDL_FreeSurface( sText ); TTF_CloseFont( fnt ); } |
SDL_Surface *sDest
- поверхность, на которую будет скопирован текст; char* message
- текст сообщения; char* font
- имя файла TrueType шрифта (например arial.ttf); int size
- размер шрифта; SDL_Color color
- структура, содержащяя цвет шрифта, вот ее прототип:
typedef struct{ Uint8 r; Uint8 g; Uint8 b; Uint8 unused; } SDL_Color; |
Uint8 unused
не используется. И, наконец, SDL_Rect dest
- содержит координаты, куда следует вывести текст (в этой структуре не используются элементы w и h). Чтобы вывести текст, мы загружаем шрифт: TTF_Font *fnt = TTF_OpenFont(font, size);
SDL_Surface *sText = TTF_RenderText_Blended( fnt, message, color);
TTF_RenderText_Blended()
отображает сглаженный шрифт. Если вам нужно использовать шрифт без сглаживания, то используйте TTF_RenderText_Solid()
с теми же самыми параметрами. Наконец, копируем надпись на поверхность, которую задали в аргументах (можно задать к примеру screen), удаляем временную поверхность sText
, чтобы очистить память и закрываем шрифт.main()
вызываем функцию для отображения текста:
SDL_Color clr = {255,50,40,0}; SDL_Rect dest = {80, 120,0,0}; print_ttf(screen, "SDL_ttf example", "courier.ttf", 46, clr, dest); clr.r = 255; clr.g = 255; clr.b = 0; dest.x = 80; dest.y = 250; print_ttf(screen, "Пример SDL_ttf", "courier.ttf", 46, clr, dest); SDL_Flip(screen); |
Дополнение к уроку 3 | Содержание | Урок 5 |
©opyleft PLG, 2003.