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)
我正在尝试在 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)