使用脏矩形方法更新 Sprite 中的文本

Updating text in Sprite using dirty rectangle method

我正在尝试使用 pygame 实现以下目标: 打印精灵的变化文本部分并每帧更新精灵。 精灵是一个简单的透明矩形区域,周围环绕着红色边缘。 在该区域的中心印有一个数字,该数字随时间变化。 我也想使用脏矩形方法。

我还没有设法让它在我的游戏中运行,但我已经在以下示例中重现了该场景(您可以 运行 按原样):

import pygame
from pygame.locals import *

class Sprite(pygame.sprite.Sprite):
        def __init__(self, group=None):

            pygame.sprite.Sprite.__init__(self, group)
            self.counter = 0

            self.image = pygame.Surface((100,100)).convert_alpha()
            self.image.fill((0,0,0,0))
            pygame.draw.rect(self.image, (255,0,0), [ (0,0), (100,100) ], 1)
            self.rect = self.image.get_rect()

            self.myfont = pygame.font.SysFont("monospace", 15)
            text = str(self.counter)
            label = self.myfont.render(text, 1, (255,0,0))
            self.image.blit(label, self.rect.center)

        def update(self):
            rect_save = self.rect
            self.image = pygame.Surface((100,100)).convert_alpha()
            self.image.fill((0,0,0,0))
            pygame.draw.rect(self.image, (255,0,0), [ (0,0), (100,100) ], 1)
            self.rect = self.image.get_rect()
            self.rect.x = rect_save[0]
            self.rect.y = rect_save[1]

            text = str(self.counter)
            label = self.myfont.render(text, 1, (255,0,0))

            self.image.blit(label, self.rect.center)


Quit = False

pygame.init()
window = pygame.display.set_mode((640, 480))
render = pygame.sprite.RenderUpdates()

sprite = Sprite(render)
BUG = False
if BUG:
    sprite.rect = (300,300)


while not Quit:
    for event in pygame.event.get():    
        if event.type == QUIT:
            Quit = True
        if event.type == KEYDOWN:
            sprite.counter += 1

    background = pygame.Surface( window.get_size() )
    background.fill( (0,0,0) )
    render.clear( window, background )

    render.update()

    dirty = render.draw(window)
    pygame.display.update( dirty )
#end while

pygame.quit()

在代码示例中我定义了一个BUG变量来触发我遇到的问题。 如果我将 BUG 设置为 False,我的 sprite 将在屏幕的左上角按需要呈现,并在按下按键时更新文本。 但是,当我将 BUG 设置为 True 时,精灵会在屏幕上的正确位置呈现,但文本不再存在。

我怎样才能使第二个案例按预期工作?

谢谢

注意: 以下 post 没有帮助解决我的问题 Python pygame writing text in sprite

BUG问题的解决方法是:

你需要明白

的意思
self.image.blit(label, self.rect.center)

如果您试图在不位于 (0,0) 的表面上以 blit 方式传输文本,这将不起作用。为什么?因为您没有直接在显示器上发送文本。你在表面上把它弄得一团糟。您需要提供相对于表面而不是显示器的坐标。

这之前是有效的,因为您的表面位于 (0,0) 处的显示器上。现在,由于您已将曲面的位置更改为 (300,300),因此 self.rect.center 现在为 (350,350)。它应该是 (50,50) 因为你的表面 (width,height) 是 (100,100)。

所以现在保留 BUG True 并将该语句更改为:

self.image.blit(label, (50,50))

如果你想要更好的定位,使用:

text = str(self.counter)
label = self.myfont.render(text, 1, (255,0,0))
text_rect = label.get_rect()
text_rect.center = (50,50)

self.image.blit(label, text_rect)