如何在 Pygame 中将文本居中到屏幕任意位置

271 阅读2分钟

在 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()