简短的回答
我还没有找到一个地方来解释我何时需要使用 blit 或不包括屏幕上的某个表面。
每个操作的行为都不同,您需要阅读您正在使用的函数的文档。
长答案
什么是 Blitting?
首先,您需要了解 blitting 的作用。您的屏幕只是像素的集合,而 blitting 是将一组像素完整复制到另一组像素上。例如,您可以拥有一个带有从硬盘驱动器加载的图像的表面,并且可以通过在表面顶部多次对该表面进行 blitting 来在屏幕上的不同位置多次显示该图像screen
。
所以,你经常有这样的代码......
my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)
在两行代码中,我们通过“blitting”将大量像素从源表面 (my_image) 复制到屏幕上。
pygame.draw.* 函数如何进行 blit?
从技术上讲,可以编写 pygame.draw.* 方法来执行类似的操作。所以,而不是你的例子......
pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)
......他们本可以让你这样做......
circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)
如果是这种情况,您将得到相同的结果。但是,在内部,该pygame.draw.circle()
方法直接操作您传递给它的表面,而不是创建一个新表面。这可能已被选为做事的方式,因为与创建新表面相比,它们可以让它运行得更快或内存更少。
那我该怎么办?
因此,对于“何时使用 blit”和“何时不使用”的问题,基本上,您需要阅读文档以了解该函数的实际作用。
这是pygame.draw.circle()文档:
pygame.draw.circle():
围绕一个点画一个圆
圆(表面、颜色、位置、半径、宽度=0)-> 矩形
在 Surface 上绘制一个圆形。pos 参数是圆的中心,radius 是大小。width 参数是绘制外边缘的厚度。如果宽度为零,则圆圈将被填充。
请注意,它说“在表面上绘制形状”,因此它已经为您完成了像素更改。此外,它不返回表面(它返回一个 Rect,但这只是告诉您像素更改的完成位置)。
现在让我们看一下pygame.font.Font.render() 文档:
在新 Surface 上绘制文本
渲染(文本,抗锯齿,颜色,背景=无)-> 表面
这将创建一个新的 Surface,并在其上呈现指定的文本。Pygame 无法直接在现有 Surface 上绘制文本:相反,您必须使用 Font.render() 来创建文本的图像(Surface),然后将该图像blit到另一个 Surface 上。...
正如你所看到的,它明确表示文本是在一个新的表面上绘制的,它被创建并返回给你。这个表面不是你屏幕的表面(不可能,你甚至没有告诉render()
函数你的屏幕表面是什么)。这是一个很好的迹象,表明您需要将这个表面实际blit到屏幕上。