Как сделать разрывы строк и перенос строк с помощью SDL-TTF?

Я только начал использовать SDL2_ttf. Я понял, как вывести текст на экран с помощью TTF_RenderText_Blended, но как заставить его делать разрывы строк и автоматический перенос?

  1. Кажется, он не поддерживает \n; он просто создает пространство вместо того, чтобы идти вниз по строке. Есть ли способ добавить поддержку для этого? В частности, используя правильную высоту строки текста, а не несколько вызовов RenderText с разными координатами Y.
  2. Учитывая координаты X, Y и ширину, как я могу автоматически перемещаться по строке всякий раз, когда достигается эта ширина (разрыв между словами)?

person mpen    schedule 25.07.2013    source источник


Ответы (2)


Вместо использования TTF_RenderText_Blended используйте TTF_RenderText_Blended_Wrapped. Он принимает дополнительный параметр: ширину в пикселях, после которой текст будет переходить на следующую строку.

person Mars    schedule 24.08.2013
comment
Это часть стандартной библиотеки? Не могу найти на него документацию. Если это существует, это мило. - person mpen; 24.08.2013
comment
Он находится в последнем SDL_ttf. Я не могу найти надлежащую документацию (не знаю, почему на нее вообще нет ссылок), но я могу заверить вас, что она работает. - person Mars; 25.08.2013
comment
Должен быть в VCS, тогда... не существует в исходниках 2.0.11. Хм... Только что скачал 2.0.12 и все тут. Потрясающий. - person mpen; 25.08.2013
comment
Всем, кто читает это: \n также работает с функциями *_Wrapped. - person mpen; 25.08.2013
comment
В этом есть ошибка, из-за которой, если в вашем тексте нет пробелов, он не переносится. - person Stanley Bak; 29.05.2016
comment
Просто хочу добавить больше информации. Марс прав, я проверил через nm -a /usr/local/lib/libSDL2_ttf.a таблицу символов; в macOS (после самостоятельной компиляции и установки, но должно быть аналогичное расположение, если используется brew). Есть _TTF_RenderText_Blended_Wrapped, _TTF_RenderUNICODE_Blended_Wrapped, _TTF_RenderUTF8_Blended_Wrapped, а документа нет вообще. Нужно заглянуть в источник для аргументов функции. - person haxpor; 24.08.2018

SDL_TTF не делает накрутку, приходится писать свою.

TTF_Font* ttf;
TTF_SizeText(ttf, "Hello World", &w, &h);

дает вам ширину и высоту строки.

person parkydr    schedule 26.07.2013
comment
Я надеялся на что-то более глубокое, но, думаю, я могу написать свой собственный класс менеджера шрифтов. - person mpen; 26.07.2013
comment
Я могу попробовать код, если хотите. С или С++? Я всегда просто разбивал любые длинные сообщения на несколько коротких. - person parkydr; 26.07.2013
comment
Собственно С#. Я пишу обертку вокруг SDL2. Вам не нужно писать какой-либо код, я просто хотел быть в курсе любых подводных камней. Единственное, что я не могу понять, как сделать прямо сейчас, это кернинг. - person mpen; 26.07.2013
comment
SDL-TTF должен это делать, он использует пропорциональные шрифты. Я бы просто использовал TTF_SizeText, чтобы получить длину каждой добавляемой строки. - person parkydr; 26.07.2013
comment
По моим тестам не похоже. Если вы пишете что-то вроде AVA, буква V должна немного выходить за пределы буквы As, но не похоже, чтобы они вообще перекрывались. Хотя, возможно, я просто использовал плохой шрифт... нужно будет больше экспериментировать. - person mpen; 26.07.2013