在 Pygame 中,如果需要将文本居中到屏幕任意位置,而不是手动通过魔术数字设置文本位置,那么如何实现呢?
2、解决方案
您可以使用数学方法来解决这个问题,而不需要知道任何有关 Pygame 的信息。
top = 外部表面高度 / 2 - 内部表面高度 / 2
left = 外部表面宽度 / 2 - 内部表面宽度 / 2
这将为您提供内部表面在外部表面的坐标系中的左上角坐标,适用于任何图形库(除非表面的坐标系可以具有不同的分辨率)。
您还可以使用 Pygame 中的 pygame.Rect() 和 rect.center、rect.topleft 函数来实现文本居中。
screen_rect = screen.get_rect() # 获取屏幕矩形
text_rect = text.get_rect() # 获取文本矩形
text_rect.center = screen_rect.center # 将文本居中到屏幕
现在,您可以将文本绘制到屏幕上的 text_rect.topleft 位置
screen.blit(text, text_rect.topleft)
rect 还有其他有用的属性:
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w, h
完整的代码示例如下:
import sys
import pygame
from pygame.locals import *
class Game():
def __init__(self):
pygame.init()
fpsClock = pygame.time.Clock()
screen = pygame.display.set_mode((1200, 600), 0, 32)
font = pygame.font.SysFont("", 72)
text_pause = font.render("PAUSE", True, (255, 0, 0))
screen_rect = screen.get_rect() # 获取屏幕矩形
text_rect = text_pause.get_rect() # 获取文本矩形
text_rect.center = screen_rect.center # 将文本居中到屏幕
RUNNING = True
PAUSED = True
while RUNNING:
for event in pygame.event.get():
if event.type == QUIT:
RUNNING = False
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
RUNNING = False
elif event.key == K_SPACE:
PAUSED = not PAUSED
screen.fill(0)
if PAUSED:
screen.blit(text_pause, text_rect.topleft)
pygame.display.update()
fpsClock.tick(25)
# --- finish ---
pygame.quit()
sys.exit()
Game().run()
您可以使用 rect.center 将文本居中到鼠标位置。
import sys
import pygame
from pygame.locals import *
class Game():
def __init__(self):
pygame.init()
fpsClock = pygame.time.Clock()
screen = pygame.display.set_mode((1200, 600), 0, 32)
font = pygame.font.SysFont("", 72)
text_pause = font.render("PAUSE", True, (255, 0, 0))
screen_rect = screen.get_rect() # 获取屏幕矩形
text_rect = text_pause.get_rect() # 获取文本矩形
text_rect.center = screen_rect.center # 将文本居中到屏幕
# --- mainloop ---
RUNNING = True
PAUSED = True
while RUNNING:
# --- events ---
for event in pygame.event.get():
if event.type == QUIT:
RUNNING = False
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
RUNNING = False
elif event.key == K_SPACE:
PAUSED = not PAUSED
if event.type == MOUSEMOTION:
text_rect.center = event.pos
# --- calcuations/moves ---
# --- draws ---
screen.fill(0)
if PAUSED:
screen.blit(text_pause, text_rect.topleft)
pygame.display.update()
# --- FPS ---
fpsClock.tick(25)
# --- finish ---
pygame.quit()
sys.exit()
Game().run()