简短回答
我还没有找到一个地方来解释我何时需要将某个表面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”和“何时不 blit”的问题,基本上,你需要阅读文档以查看函数实际上做了什么。
这是
pygame.draw.circle()的文档:
pygame.draw.circle():
在一个点周围画圆
circle(Surface, color, pos, radius, width=0) -> Rect
在表面上绘制圆形。pos参数是圆心,radius是大小。width参数是绘制外边缘的厚度。如果宽度为零,则圆将被填充。
请注意,它说“在表面上绘制形状”,因此它已经为您执行了像素更改。另外,它不返回表面(它返回一个矩形,但这只告诉您像素更改发生的位置)。
现在让我们看一下
pygame.font.Font.render()文档:
渲染文字到新表面
render(text, antialias, color, background=None) -> Surface
这将创建一个新的表面,并在其上呈现指定的文本。Pygame没有提供直接在现有表面上绘制文本的方法:相反,您必须使用Font.render()来创建文本的图像(表面),然后将此图像blit到另一个表面上。
正如你所看到的,它明确表示文本是绘制在一个新的表面上的,这个表面是被创建并返回给你的。这个表面不是你屏幕的表面(它不能是,因为你甚至没有告诉
render()
函数你的屏幕表面是什么)。这是一个非常好的迹象,表明你实际上需要将这个表面blit到屏幕上。
pygame.draw.circle(surface, ...)
会直接绘制到surface
上。而font.Render()
则返回一个新的Surface
,但不会自动渲染。http://www.pygame.org/docs/ref/font.html#pygame.font.Font.render - ninMonkey