Как масштабировать текст без увеличения разрешения шрифта?

import pygame

pygame.init()

run = True
scale = 3
width = 256
height = 224
screen = pygame.display.set_mode((width*scale, height*scale), pygame.FULLSCREEN)
highScore = 0

textColour = (0,0,0)
font = pygame.font.Font("FreeSerif.ttf", 10)
textSurface = font.render(f"HiScore: {highScore}", True, (textColour))
textRect = textSurface.get_rect()
textRect.center = (width*scale//2, height*scale//2)


while run:

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
    highScore += 1
    screen.fill((255, 0, 0))
    textSurface = font.render(f"HiScore: {highScore}", True, (textColour))
    screen.blit(textSurface, textRect)
    pygame.display.update()

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

Я пытался установить textRect.w и textRect.h вручную, я пробовал pygame.transform.scale на нескольких вещах и пробовал метод надувания. Все ожидали, что текст масштабируется, но не повезло.

Вы можете масштабировать отображаемую поверхность, но это приведет к пикселизации или размытию текста. Так что не делай этого. Используйте разные объекты шрифта разного размера текста для разного масштаба. Это единственный вариант получить хорошее качество.

Rabbid76 12.12.2022 13:07

Для этого подойдет Pygame.transform.scale, и может выглядеть неплохо, если вы увеличите масштаб на целое число. Вы не показали код для transform.scale, возможно, вы не используете вывод этой функции? Помните, что transform.scale возвращает новую масштабированную поверхность, а не изменяет масштаб переданного аргумента.

Starbuck5 12.12.2022 19:05

@ Rabbid76, Использование шрифта большего размера текста сделает текст в другом разрешении по сравнению с остальной частью игры.

sihea 13.12.2022 14:23

@ Starbuck5, где я должен использовать pygame.transform.scale? Я пробовал «screen.blit(pygame.transform.scale(text, textRect), (textRect.xscale, textRect.yscale))», я пробовал «text = pygame.transform.scale(text, (text.xscale , text.yscale))´

sihea 13.12.2022 14:25

@sihea Вы можете создать более 1 объекта шрифта.

Rabbid76 13.12.2022 15:00

@sihea Если вы не изменили размер textrect, вы просто масштабируете его до того же размера, что и раньше.

Starbuck5 13.12.2022 19:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы пытаетесь решить, какой подход вы предпочитаете, вы можете перебрать несколько вариантов и посмотреть, как они выглядят.

Вот пример, который перебирает некоторые размеры шрифта и коэффициенты масштабирования:

import pygame

pygame.init()

run = True
scale = 3
width = 256
height = 224
# screen = pygame.display.set_mode((width*scale, height*scale), pygame.FULLSCREEN)
screen = pygame.display.set_mode((width * scale, height * scale))
high_score= 0

text_colour = (0, 0, 0)
fonts = []
font_sizes = 10, 12, 14, 16, 20, 24, 30, 36
for size in font_sizes:
    # font = pygame.font.Font("FreeSerif.ttf", size)
    font = pygame.font.Font(None, size) 
    fonts.append(font)

font_scales = [1, 2, 3, 4, 5, 6]
grid_width = width * scale // len(font_scales)
grid_height = height * scale // len(font_sizes)

clock = pygame.time.Clock()
while run:

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
        elif event.type == pygame.QUIT:
            run = False
    high_score+= 1
    screen.fill("red")
    for y, font in enumerate(fonts):
        for x, f_scale in enumerate(font_scales):
            # msg = f"{font_sizes[y]} x {f_scale:2} : {high_score}"
            msg = f"{font_sizes[y]} x {f_scale:2}"
            text_surface = font.render(msg, True, (text_colour))
            text_surface = pygame.transform.scale_by(text_surface, f_scale)
            text_rect = text_surface.get_rect()
            text_rect.left = grid_width * x + 10
            text_rect.top = grid_height * y + 10
            screen.blit(text_surface, text_rect)

    pygame.display.update()
    clock.tick(30)
pygame.quit()

Большие размеры и масштабы текста накладываются друг на друга, а интервалы можно было бы улучшить, но этого должно быть достаточно, чтобы вы могли сравнивать и опираться на них.

Я также изменил имена некоторых переменных, чтобы они соответствовали Руководству по стилю Python (PEP 8).

Я получаю сообщение об ошибке, что "'pygame.transform' не имеет атрибута 'scale_by'"

sihea 03.01.2023 14:46

@sihea transform.scale_by(...) был представлен в PyGame 2.1.3. Если у вас более ранняя версия и вы не хотите обновляться, вы можете использовать transform.scale(...) с явным указанием размера; т. е. x = width * scaling_factor и т. д. Сообщите нам, если у вас не получится заставить его работать.

import random 04.01.2023 06:26

Версия Raspi, встроенная в pygame, была 1.9.x, а последней поддерживаемой версией без dev была 2.1.2, но после обновления ОС, python и загрузки версии pygame 2.1.3.dev8 я столкнулся с проблемой, что полноэкранный начал глючить. Масштабирование теперь работает, так что это круто.

sihea 31.01.2023 15:00

Другие вопросы по теме