Как установить sdl ttf
Перейти к содержимому

Как установить sdl ttf

  • автор:

Вывод русского тексты с помощью SDL_ttf

С латиницей проблем нет, все работает как надо, но вместо кириллицы совершенно другие символы. Вот код, если это поможет.

#include #include #include #include #include using namespace std; string OUT_STRING; SDL_Color color = < 255,255,255 >; char* cts(char c) < char *ptr = (char*)malloc(2 * sizeof(char)); ptr[0] = c; ptr[1] = '\0'; return ptr; >void TextOut(SDL_Renderer *ren, TTF_Font *f) < SDL_Surface *sur; SDL_Texture *tex; static SDL_Rect rect; static int32_t x; if (OUT_STRING[x] == NULL) return; char *temp = cts(OUT_STRING[x]); TTF_SizeText(f, temp, &rect.w, &rect.h); if (!(sur = TTF_RenderText_Blended(f, temp, color))) cout int main(int argc, char* argv[]) < SDL_Window *main_window; SDL_Renderer *renderer; SDL_Surface *screen; SDL_Surface *text; SDL_Event e; TTF_Font *font; SDL_Rect rect; SDL_Texture *texture; bool quit = false; SDL_Init(SDL_INIT_EVERYTHING); TTF_Init(); main_window = SDL_CreateWindow("My window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 1000, SDL_WINDOW_SHOWN); font = TTF_OpenFont("C:/Users/STAS/source/repos/ConsoleApplication3/ConsoleApplication3/l_10646.ttf", 32); if (!font) cout TextOut(renderer, font); cout SDL_Delay(3000); return 0; > 

Отслеживать

задан 23 сен 2018 в 6:00

Черный Камень Черный Камень

33 5 5 бронзовых знаков

static int32_t x; if (OUT_STRING[x] == NULL) return; Что произойдет, если вызвать функцию дважды?

23 сен 2018 в 7:12

Можно рисовать текст через два функции 1. GetGlyphOutlineA 2. glBitmap 3. Пару функций позицирования, кода и перевернуть массив.

Как правильно подключить библиотеку SDL

Author24 — интернет-сервис помощи студентам

Здравствуйте, подскажите, пожалуйста, как правильно подключить библиотеку SDL.
Я пользуюсь компилятором Code::Blocks.
При подключении SDL появляется ошибка:
undefined reference to `WinMain@16′
Скажите, пожалуйста, как это исправить.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

SDL 2. Как правильно прилинковать/подключить к Visual Studio?
Я пересмотрел много материалов по этой теме, но никакие из них мне не помогли. 1. Подключил.

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2?
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта.

Как правильно подключить данную библиотеку ?
Доброго времени суток подскажите пожалуйста как правильно подключить данную библиотеку в.

Как правильно подключить свою библиотеку?
Здравствуйте всем. Я использую Visual Studio. В одном решении у меня находится проект библиотеки.

Заблокирован
Ну так ты наверное пытаешься подключить библиотеки к консольному проекту, а нужно к проекту Win32
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

ЦитатаСообщение от albert! Посмотреть сообщение

Скажите, пожалуйста, как это исправить.
Точку входа вот такую сделайте:

int main(int argc, char *argv[]) .

Регистрация: 23.01.2013
Сообщений: 45

-NEURON-,Я уже не помню, к какому подключаю, а всё заново переписывать не хочется. Если проект консольный, то к нему же, наверное, тоже можно подключить SDL. Не подскажете как?(GLUT работает без проблем)
_________
Alsav, функция main выглядит именно так.

5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

ЦитатаСообщение от albert! Посмотреть сообщение

функция main выглядит именно так.
Код давайте.
Регистрация: 23.01.2013
Сообщений: 45

ЦитатаСообщение от alsav22 Посмотреть сообщение

Код давайте.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#include #include #include #include #include #include  #include  #include  #include  #include #include  using namespace std; . int main(int argc,char* argv[]) { glutInit(&argc,argv); glutInitWindowSize(WinWid,WinHei); glutInitDisplayMode(GLUT_DOUBLE  SetButtonInfo(); glMatrixMode(GL_PROJECTION); gluOrtho2D (0.0,WinWid, 0.0,WinHei); glShadeModel(GL_FLAT); glutReshapeFunc(Reshape); glutDisplayFunc(Display); glutMouseFunc(Mouse); glutKeyboardFunc(Keyboard); glutTimerFunc(50,Timer,0); glutMainLoop(); return 0; }

Более подробный код давать?
Заблокирован
OpenGL сделан не для консольных проектов. Попробуй заменить свой код на этот:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
#include #include #include #include #include #include #include  #include  #include  #include  #include #include  using namespace std; . int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow)  UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); glutInit(&argc, argv); glutInitWindowSize(WinWid, WinHei); glutInitDisplayMode(GLUT_DOUBLE  SetButtonInfo(); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, WinWid, 0.0, WinHei); glShadeModel(GL_FLAT); glutReshapeFunc(Reshape); glutDisplayFunc(Display); glutMouseFunc(Mouse); glutKeyboardFunc(Keyboard); glutTimerFunc(50, Timer, 0); glutMainLoop(); return 0; }

Регистрация: 23.01.2013
Сообщений: 45

ЦитатаСообщение от -NEURON- Посмотреть сообщение

OpenGL сделан не для консольных проектов. Попробуй заменить свой код на этот:
Теперь вот какая ошибка

1 2 3 4 5 6 7 8 9 10 11 12
Stockpiles\main.cpp|220|warning: `__stdcall__' attribute only applies to function types| Stockpiles\main.cpp|220|error: `int WinMain' redeclared as different kind of symbol| E:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\include\winbase.h|1040|error: previous declaration of `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)'| Stockpiles\main.cpp|220|error: declaration of `int WinMain'| E:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\include\winbase.h|1040|error: conflicts with previous declaration `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)'| Stockpiles\main.cpp|220|error: `_In_' was not declared in this scope| Stockpiles\main.cpp|220|error: `_In_opt_' was not declared in this scope| Stockpiles\main.cpp|220|error: `_In_' was not declared in this scope| Stockpiles\main.cpp|220|error: `_In_' was not declared in this scope| Stockpiles\main.cpp|221|error: initializer expression list treated as compound expression| Stockpiles\main.cpp|221|error: expected `,' or `;' before '{' token| ||=== Build finished: 10 errors, 1 warnings ===|

Цикл уроков по SDL 2.0: урок 6 — Загружаем шрифты с помощью SDL_ttf

image

Это продолжение серии переводов туториалов от Twinklebear, в оригинале доступных тут. Перевод отчасти вольный и может содержать незначительные поправки или дополнения от переводчика. Перевод первых двух уроков — за авторством InvalidPointer, а третьего и четвертого — за k1-801.

Список уроков:

  • Урок 1. Hello World!
  • Урок 2. Не запихивайте все в main
  • Урок 3. Библиотеки-расширения SDL
  • Урок 4. Обработка событий
  • Урок 5. Нарезка листа спрайтов
  • Урок 6. Загружаем шрифты с помощью SDL_ttf

Загружаем шрифты с помощью SDL_ttf

В этом уроке мы узнаем, как отображать шрифты формата True Type font с помощью библиотеки-расширения SDL_ttf. Установка библиотеки идентична установке SDL_image в Уроке 3, но вместо “image” просто пишем “ttf” (пользователям Windows стоит еще скопировать включенный dll freetype). Так что загрузите SDL_ttf, взгляните на документацию и приступайте к уроку!

Первое, что нам нужно для работы с SDL_ttf, — это ttf шрифт. Используя BitFontMaker, автор сделал довольно ужасный шрифт, который вы можете скачать из репозитория, но если у вас уже имеется свой красивый шрифт, то можно использовать его. Этот шрифт предоставляет только простые символы ASCII, так что если вы попробуете отобразить не-ASCII символы, то скорее всего это не получится. Код этого урока будет написан на основе урока 5, как обычно вы можете скачать его с Github. Изображения, нарезанные спрайты и рисунки будут изменены в этом уроке.

Отображаемый текст

SDL_ttf обеспечивает несколько способов отображения шрифтов различной скорости и качества, а также возможность отображения UTF8 и Unicode символов. Документация предоставляет неплохой обзор различных методов отображения, так что стоит почитать и узнать о них больше, когда и какой метод вы хотите использовать в зависимости от ваших требований к качеству и скорости. В этом уроке мы будем использовать TTF_RenderText_Blended, так как у нас нет никаких временных ограничений и хотим, чтобы наш текст был красивым. Различные функции отображения текста принимают цвет в формате RGB SDL_Color, который мы можем использовать, чтобы подобрать цвет текста для отрисовки.

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

Пишем функцию renderText

Чтобы упростить себе жизнь, создадим функцию renderText, которая будет принимать текст, файл, содержащий шрифт TTF, цвет, желаемый размер и рендерер для загрузки окончательной текстуры. Функция открывает шрифт, отображает текст, преобразует его в текстуру и возвращает текстуру. Так как могут возникнуть проблемы, нужно проверить каждый вызов библиотеки на ошибки и правильно их обработать, например, почистить ресурсы, логгировать ошибки и вернуть nullptr, чтобы мы знали, что произошло что-то плохое. SDL_ttf сообщает все свои ошибки через SDL_GetError, так что можно продолжать использовать logSDLError для логгирования ошибок.

Держа в уме эти требования, давайте напишем функцию renderText:

/** * Отображает текст в текстуру для отрисовки * @param message Сообщение, которое хотим отобразить * @param fontFile Шрифт, который хотим использовать * @param color Цвет, в который хотим окрасить текст * @param fontSize Размер шрифта * @param renderer Рендерер, в который нужно загрузить текстуру * @return SDL_Texture, содержащий отрендеренный текст или nullptr, если что-то пошло не так */ SDL_Texture* renderText(const std::string &message, const std::string &fontFile, SDL_Color color, int fontSize, SDL_Renderer *renderer) < //Открываем шрифт TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize); if (font == nullptr)< logSDLError(std::cout, "TTF_OpenFont"); return nullptr; >//Сначала нужно отобразить на поверхность с помощью TTF_RenderText, //затем загрузить поверхность в текстуру SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color); if (surf == nullptr) < TTF_CloseFont(font); logSDLError(std::cout, "TTF_RenderText"); return nullptr; >SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surf); if (texture == nullptr) < logSDLError(std::cout, "CreateTexture"); >//Очистка поверхности и шрифта SDL_FreeSurface(surf); TTF_CloseFont(font); return texture; > 

Предупреждение о производительности

Очень важно заметить, что каждый раз, когда хотим отобразить текст, заново открываем и закрываем шрифт, что подходит в нашем случае, так как отображаем текст один раз, но если мы захотим отобразить много текста и/или слишком часто, то лучшей идеей будет держать шрифт открытым столько, сколько нам нужно. Наша версия renderText для этого более частого случая будет принимать TTF_Font* вместо названия файла шрифта и не будет открывать и закрывать, так как жизнь файла шрифта будет регулироваться отдельно.

Инициализируем SDL_ttf

Как и с SDL нам нужно инициализировать библиотеку перед тем, как использовать ее. Это делается с помощью TTF_Init, который вернет 0 в случае успеха. Чтобы инициализировать SDL_ttf, мы лишь вызываем эту функцию после инициализации SDL и проверяем вернувшееся значение, чтобы убедиться, что все нормально.

if (TTF_Init() != 0)

Используем renderText

С помощью нашей удобной функции renderText мы можем отображать текст одним простым вызовом. Для этого урока отобразим текст “TTF fonts are cool!” белого цвета, размера 64 шрифтом, который мы скачали до этого. Затем мы можем запросить ширину и высоту так же, как и для любой другой текстуры, и вычислить координаты x/y, чтобы нарисовать сообщение в центре окна.

const std::string resPath = getResourcePath("Lesson6"); //Мы отображаем строку "TTF fonts are cool!" //Цвет в формате RGBA SDL_Color color = < 255, 255, 255, 255 >; SDL_Texture *image = renderText("TTF fonts are cool!", resPath + "sample.ttf", color, 64, renderer); if (image == nullptr) < cleanup(renderer, window); TTF_Quit(); SDL_Quit(); return 1; >//Получим ширину и высоту текстуры, чтобы отобразить ее в центре int iW, iH; SDL_QueryTexture(image, NULL, NULL, &iW, &iH); int x = SCREEN_WIDTH / 2 - iW / 2; int y = SCREEN_HEIGHT / 2 - iH / 2; 

Рисуем текст

В конце концов можем нарисовать текстуру, как мы это делали до этого с помощью функции renderTexture.

//Заметка: Это в основном цикле программы SDL_RenderClear(renderer); //Мы можем отрисовать наш текст, как и любую другую текстуру, так как //он был отрендерен в текстуру renderTexture(image, renderer, x, y); SDL_RenderPresent(renderer); 

Если все пошло по плану, вы увидите что-то вроде такого:

image

Конец урока 6

Это все, что нужно знать, чтобы начать пользоваться SDL_ttf! Не забудьте посмотреть документацию, чтобы увидеть, на что эта библиотека способна. Как обычно, если у вас возникнут проблемы с уроком, можете писать в комментариях.

Автор стал занят другими проектами и не сможет писать уроки больше, так что это был последний урок из цикла. Вы можете посмотреть уроки от Lazy Foo или почитать примеры и документацию из SDL wiki.

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

Это код рендеринга внутри функции 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(); >

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *