| Дополнение к уроку 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.