Pygame - 移动矩形中的居中文本

Pygame - center text in moving rect

我正在 pygame 中制作数字游戏,其中的方块将从屏幕顶部落到底部,同时每个方块上都会显示一个数值和该数字。我正在努力让文本以正方形为中心,当每个数字可以包含 1 - 4 位数字时,这变得更加困难

class sqr:
    def __init__(self):
        self.colours = [(255,0,0), (0,255,0), (0,0,255)]
        self.Xpositions = [0,125,245,365,485]
        self.OnScreen = False
        self.X = random.choice(self.Xpositions) 
        self.Y = 0
        self.colour = random.choice(self.colours)
        self.number = random.choice([20,40,80])
        self.numberFont =  pygame.font.Font("TitilliumWeb-Black.ttf", 48)

    def drawSquare(self, colour,  X, Y):
        pygame.draw.rect(screen, colour, (X, Y, 120, 120))

    def numberTextFunc(self, X, Y):
        numberText = self.numberFont.render(f"{self.number}", True, (87, 63, 63))
        screen.blit(numberText, (X , Y))

square = sqr()

gameRunning = True
while gameRunning:

    background = screen.fill((0,100,140))
    
    #draw lines for grid
    for i in range(5):
        pygame.draw.rect(screen, (0,0,0), (line[i], 0 , 5, 800))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameRunning = False

    #square
    square.drawSquare(square.colour, square.X, square.Y)
    square.numberTextFunc(square.X, square.Y)
    square.OnScreen = True

    square.Y += 1

    if square.Y >= 680:
        square.Y = 680

    pygame.display.update()

使用pygame.Surface.get_rect to get the text rectangle. pygame.Surface.get_rect.get_rect() returns a rectangle with the size of the Surface object, that always starts at (0, 0). Set the center of the text rectangle by the center of the square. Use the text reectnagle to blit文本。 blit 的第二个参数是元组 (x, y) 或矩形。对于矩形,只考虑矩形的左上角。因此,您可以将文本矩形直接传递给 blit:

class sqr:
    # [...]

    def numberTextFunc(self, X, Y):
        numberText = self.numberFont.render(f"{self.number}", True, (87, 63, 63))
        rect = pygame.Rect(X, Y, 120, 120)
        textRect = numberText.get_rect(center = rect.center)
        screen.blit(numberText, textRect)

您可以简化代码。 XY 是对象的属性。因此不需要将坐标传递给方法:

class sqr:
    def __init__(self):
        self.colours = [(255,0,0), (0,255,0), (0,0,255)]
        self.Xpositions = [0,125,245,365,485]
        self.OnScreen = False
        self.X = random.choice(self.Xpositions) 
        self.Y = 0
        self.colour = random.choice(self.colours)
        self.number = random.choice([20,40,80])
        self.numberFont =  pygame.font.Font("TitilliumWeb-Black.ttf", 48)

    def drawSquare(self, colour):
        pygame.draw.rect(screen, colour, (self.X, self.Y, 120, 120))

    def numberTextFunc(self):
        numberText = self.numberFont.render(f"{self.number}", True, (87, 63, 63))
        rect = pygame.Rect(self.X, self.Y, 120, 120)
        textRect = numberText.get_rect(center = rect.center)
        screen.blit(numberText, textRect)
gameRunning = True
while gameRunning:

    background = screen.fill((0,100,140))

    #draw lines for grid
    for i in range(5):
        pygame.draw.rect(screen, (0,0,0), (line[i], 0 , 5, 800))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameRunning = False

    #square
    square.drawSquare(square.colour)
    square.numberTextFunc()
    square.OnScreen = True

    square.Y += 1
    if square.Y >= 680:
        square.Y = 680

    pygame.display.update()