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

时间:2017-06-07 09:36:04

标签: python pygame sprite

我正在尝试使用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,我的精灵会在屏幕的左上角呈现为需要,并在按下键时更新文本。 但是当我将BUG设置为True时,精灵会在屏幕上的正确位置呈现,但文本不再存在。

如何让第二种情况按预期工作?

由于

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

1 个答案:

答案 0 :(得分:0)

BUG问题的解决方案是:

您需要了解

的含义
self.image.blit(label, self.rect.center)

如果您尝试在未定位于(0,0)的曲面上对文本进行blit,则无效。为什么?因为您不是直接在显示屏上显示文本。你在表面上瞎了。您需要提供与曲面相对应的坐标,而不是显示。

当你的表面在(0,0)的显示器上定位时,这是有用的。现在,当您将曲面的位置更改为(300,300)时,self.rect.center现在(350,350)。它应该是(50,50),因为你的表面(宽度,高度)是(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)