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

Python 使用脏矩形方法更新Sprite中的文本,python,pygame,sprite,Python,Pygame,Sprite,我正在尝试使用pygame实现以下目标: 打印精灵的更改文本部分并每帧更新精灵。 精灵是一个简单的透明矩形区域,由红色边缘包围。 在该区域的中心打印一个数字,该数字随时间而变化。 我还想使用脏矩形方法 我还没有设法使它在我的游戏中工作,但我在以下示例中重现了该场景(您可以按原样运行): 在代码示例中,我定义了一个BUG变量来触发我遇到的问题。 如果我将错误设置为False,我的精灵将在屏幕左上角按需要渲染,并在按下键时更新文本。 但是,当我将BUG设置为True时,精灵会在屏幕上的正确位置渲染,

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

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

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

我怎样才能使第二个案例如预期的那样起作用

谢谢

注: 下面的帖子无助于解决我的问题

错误问题的解决方案是:

你需要理解

self.image.blit(label, self.rect.center)
如果尝试在未定位在(0,0)的曲面上blit文本,则此操作无效。为什么?因为你没有直接在屏幕上显示文本。你是在表面上展示它。您需要提供相应于曲面而不是显示器的坐标

这在以前起作用,因为曲面在显示器上的位置为(0,0)。现在,将曲面的位置更改为(300300),self.rect.center现在为(350350)。它应该是(50,50),因为你的表面(宽度,高度)是(100100)

因此,现在保持错误为真,并将该语句更改为:

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)

使用render.update()时,将调用sprite(用户定义的sprite类的对象)的update()函数。现在,正如这里的so计数器增量一样,计数器不会得到更新。改变:用“sprite.counter+=1”代替“counter+=1”。我错了,谢谢!我已经更正并稍微编辑了代码。现在它完全重现了我在整个游戏中的体验。只需将“BUG”变量从True改为False,即可触发我的问题。完善此选项,即可解决我的问题!我假设self.rect.center实际上返回了曲面中心相对于曲面左上角的偏移量。但我忘了我不应该“假设”任何事情,因为这会让“u”和“我”变成“屁股”。)
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)