如何使用 pygame 制作名牌

How to make a nametag with pygame

在 Pygame 中,我正在尝试创建一个显示在矩形顶部的名称标签。但我不确定如何正确居中。我已经对如何解决这个问题做了很多研究,但一直找不到任何帖子或解决方案,所以如果有人能帮助我解决这个问题,我将不胜感激。

这是我的代码:

import pygame

run = True

pygame.init()
    
win = pygame.display.set_mode((500, 500))

pygame.display.set_caption("Mob Fighting Game")

vel_x = 2.5

vel_y = 10

isJump = False
Color = (255,255,255)

font = pygame.font.Font('freesansbold.ttf', 15)

class Mob():
    def __init__(self, name):
        self.Name = name
        self.Character = None
    def CreateMob(self, xPos, yPos, width, height): 
        if not self.Character:
            self.Character = pygame.rect.Rect(xPos, yPos, width, height)
            return self.Character
        else:
            raise AssertionError("Character already exists!")
        
    def DrawMob(self):
        if self.Character:
            pygame.draw.rect(win, (255,0,0), self.Character)

class Player():
    def __init__(self, name):
        self.Name = name
        self.Character = None
        
    def CreateCharacter(self, xPos, yPos, width, height): 
        if not self.Character:
            self.Character = pygame.rect.Rect(xPos, yPos, width, height)
            return self.Character
        else:
            raise AssertionError("Character already exists!")
      
    def DrawCharacter(self, DrawWithDisplay):
        if self.Character:
            pygame.draw.rect(win, (255,0,0), self.Character)
        if DrawWithDisplay:
            DisplayNameText=font.render(str(self.Name), 1, Color)
            win.blit(DisplayNameText, (self.Character.left, self.Character.top))
        
Plr = Player("Jimmmy")
Chr = Plr.CreateCharacter(200, 200, 25, 25)
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT]:
         Chr.move_ip(vel_x, 0)
    if keys[pygame.K_LEFT]:
        Chr.move_ip(-vel_x, 0)
    if keys[pygame.K_SPACE]:
        isJump = True
    if isJump:
        Chr.move_ip(0, -vel_y)
        vel_y -= 1
        if vel_y < -10:
            isJump = False
            vel_y = 10
    win.fill((0, 99, 0))
    Plr.DrawCharacter(True)
    pygame.display.update() 

pygame.quit()

获取文本大小的矩形并将矩形的底部中心设置为播放器的顶部中心(参见pygame.Surface.get_rect):

text_rect = DisplayNameText.get_rect(midbottom = self.Character.midtop)
win.blit(DisplayNameText, text_rect)


玩家class:

class Player():
    def __init__(self, name):
        self.Name = name
        self.Character = None
        
    def CreateCharacter(self, xPos, yPos, width, height): 
        if not self.Character:
            self.Character = pygame.rect.Rect(xPos, yPos, width, height)
            return self.Character
        else:
            raise AssertionError("Character already exists!")
      
    def DrawCharacter(self, DrawWithDisplay):
        if self.Character:
            pygame.draw.rect(win, (255,0,0), self.Character)
        if DrawWithDisplay:
            DisplayNameText=font.render(str(self.Name), 1, Color)
            text_rect = DisplayNameText.get_rect(bottomleft = self.Character.topleft)
            win.blit(DisplayNameText, text_rect)