使用脏矩形方法更新 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)
我正在尝试使用 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)