pygame blitting - 居中

pygame blitting - center

我正在尝试在 python 中为 pygame 编写一个脚本来绘制一个文本居中的按钮,但是当我 blit 到屏幕上时,它 blits 到我给它的 x 和 y ,而不是按比例居中的位置。我希望能够将它集中到一组 (x,y,w,h)。我该怎么做?这是我的代码:

# Imports
import pygame

class Text:
    'Centered Text Class'
    # Constructror
    def __init__(self, text, (x,y,w,h), color = (0,0,0)):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        # Start PyGame Font
        pygame.font.init()
        font = pygame.font.SysFont("sans", 20)
        self.txt = font.render(text, True, color)
    # Draw Method
    def Draw(self, screen):
        coords = (self.x, self.y)
        screen.blit(self.txt, coords)

编辑:评论,是的,我知道,但我只使用 x 和 y 作为临时变量,因为我不知道居中的 x 和 y 是什么来使文本居中。 (我想知道如何将它的 CENTER 居中到一个矩形,而不是它的左上角)

如果你想完美地居中对象: 当您为对象提供 Pygame 坐标时,它会将它们作为左上角的坐标。因此我们必须将 x 和 y 坐标减半。

coords = (self.x/2, self.y/2)
screen.blit(self.txt, coords)

除此之外,您的问题还不清楚。

我认为像下面这样的东西可以满足您的需求。它使用 pygame.font.Font.size() 来确定渲染文本所需的 space 数量,然后将其居中在 CenteredText 实例定义的矩形区域内。

class CenteredText(object):
    """ Centered Text Class
    """
    def __init__(self, text, (x,y,w,h), color=(0,0,0)):
        self.x, self.y, self.w, self.h = x,y,w,h
        pygame.font.init()
        font = pygame.font.SysFont("sans", 20)
        width, height = font.size(text)
        xoffset = (self.w-width) // 2
        yoffset = (self.h-height) // 2
        self.coords = self.x+xoffset, self.y+yoffset
        self.txt = font.render(text, True, color)

    def draw(self, screen):
        screen.blit(self.txt, self.coords)
        # for testing purposes, draw the rectangle too
        rect = Rect(self.x, self.y, self.w, self.h)
        pygame.draw.rect(screen, (0,0,0), rect, 1)

鉴于:

text = CenteredText('Hello world', (200,150,100,100))

这是在 500x400 像素 window 中调用 text.draw(screen) 的结果。

您需要使用 font.size() 方法来确定渲染文本的大小。

类似于:

class Text:
    """Centered Text Class"""
    # Constructror
    def __init__(self, text, (x,y), color = (0,0,0)):
        self.x = x #Horizontal center of box
        self.y = y #Vertical center of box
        # Start PyGame Font
        pygame.font.init()
        font = pygame.font.SysFont("sans", 20)
        self.txt = font.render(text, True, color)
        self.size = font.size(text) #(width, height)
    # Draw Method
    def Draw(self, screen):
        drawX = self.x - (self.size[0] / 2.)
        drawY = self.y - (self.size[1] / 2.)
        coords = (drawX, drawY)
        screen.blit(self.txt, coords)

让 pygame 使用 Rect 为您计算并将文本的中心分配给目标中心:

# Start PyGame Font
pygame.font.init()
font = pygame.font.SysFont("sans", 20)

class Text:
    'Centered Text Class'
    # Constructror
    def __init__(self, text, (x,y,w,h), color = (0,0,0)):
        self.rect = pygame.Rect(x, y, w, h)
        self.txt = font.render(text, True, color)
    # Draw Method
    def Draw(self, screen):
        coords = self.txt.get_rect()
        coords.center = self.rect.center
        screen.blit(self.txt, coords)