Правильно выровнять текст в pygame - PullRequest
1 голос
/ 02 августа 2020

Я работаю над реализацией текстового поля в pygame. Проблема в том, что место, в котором отображается текст, не согласовано, хотя текст всегда отображается в одной и той же позиции (x, y). Например, отображение символа подчеркивания дает следующее (символ отображается вверху):

enter image description here

When I add more characters, the underscore moves to align with the remaining characters:

_

Этого не произойдет, если вы введете эти символы, например, в строку поиска stackoverflow.com.

Есть ли способ сделать рендеринг постоянно согласованным, чтобы все символы отображаются в их окончательном положении независимо от окружающего контекста?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

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

text_y + font_ascender - text_height
0 голосов
/ 02 августа 2020

Когда вы render текст из объекта pygame.font.Font, результатом будет pygame.Surface. Когда вы используете blit, тогда аргумент dest указывает верхний левый угол source Surface.

Если вы хотите выровнять нижнюю часть текста, то вам нужно вычислить верх, в зависимости от высоты (get_height()) визуализированного текста. Поверхность:

desired_height = ... # height of a capital letter like "A"

text_surface = m_font.Render()
text_y = y + max(0, desired_height - text_surface.get_height()

scree.blit(text_surface, (x, text_y )
...