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 на нескольких вещах и пробовал метод надувания. Все ожидали, что текст масштабируется, но не повезло.
Для этого подойдет Pygame.transform.scale, и может выглядеть неплохо, если вы увеличите масштаб на целое число. Вы не показали код для transform.scale, возможно, вы не используете вывод этой функции? Помните, что transform.scale возвращает новую масштабированную поверхность, а не изменяет масштаб переданного аргумента.
@ Rabbid76, Использование шрифта большего размера текста сделает текст в другом разрешении по сравнению с остальной частью игры.
@ 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 Вы можете создать более 1 объекта шрифта.
@sihea Если вы не изменили размер textrect, вы просто масштабируете его до того же размера, что и раньше.






Если вы пытаетесь решить, какой подход вы предпочитаете, вы можете перебрать несколько вариантов и посмотреть, как они выглядят.
Вот пример, который перебирает некоторые размеры шрифта и коэффициенты масштабирования:
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 transform.scale_by(...) был представлен в PyGame 2.1.3. Если у вас более ранняя версия и вы не хотите обновляться, вы можете использовать transform.scale(...) с явным указанием размера; т. е. x = width * scaling_factor и т. д. Сообщите нам, если у вас не получится заставить его работать.
Версия Raspi, встроенная в pygame, была 1.9.x, а последней поддерживаемой версией без dev была 2.1.2, но после обновления ОС, python и загрузки версии pygame 2.1.3.dev8 я столкнулся с проблемой, что полноэкранный начал глючить. Масштабирование теперь работает, так что это круто.
Вы можете масштабировать отображаемую поверхность, но это приведет к пикселизации или размытию текста. Так что не делай этого. Используйте разные объекты шрифта разного размера текста для разного масштаба. Это единственный вариант получить хорошее качество.