我正在尝试使用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
答案 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)