27

我刚刚开始学习一些 pygame(对整体编程来说非常新),并且我对它的工作原理有一些非常基本的问题。

我还没有找到一个地方来解释我何时需要使用 blit 或不包括屏幕上的某个表面。比如画圆的时候:

circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

我不需要这样做screen.blit(circle),但是在显示文本时:

text = font.render("TEXT", 1, (10, 10, 10)) 
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)

如果我不 blit,文本将不会出现。

老实说,除了将所需的表面“粘贴”到屏幕上之外,我真的不知道 blitting 应该做什么。我希望我已经足够清楚了。

4

3 回答 3

55

简短的回答

我还没有找到一个地方来解释我何时需要使用 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到屏幕上。

于 2013-07-03T19:30:15.163 回答
12

Blit 的意思是 'BL'ock 'I'mage 'T'ranfser

当你在屏幕上显示东西时,你会以某种方式使用,screen因为那是你放置它的地方。

当你这样做时:

pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

您仍在使用屏幕,但您只是没有进行 blitting,因为 pygame 正在为您绘制它。

当您使用文本时,pygame 会将其渲染为图像,然后您必须对其进行 blit。

所以基本上你是 blit 图像,但你也可以让 pygame 为你绘制它们。但是请记住,当您对图像进行 blit 时,例如在背景上,您需要将其循环回来第四次;这样它就会使背景,然后是图像,然后是背景等...

你不需要知道更多,但你可以在这里阅读所有相关信息Pygame Blit

我希望这会有所帮助。祝你好运!

于 2013-07-03T17:20:35.300 回答
3

想象一下你是一个画家:

你有一张画布和一把画笔。

假设您的主屏幕表面将是您的画布,而所有其他表面都“在您的脑海中”——您已经知道如何绘制它们。

当你调用 blit 时,你在表面绘画,覆盖任何重叠的像素。这就是为什么您需要将整个屏幕重新涂成黑色,以便在移动对象时不会在绘画上留下任何污迹。

正如马克已经说过的,你可以用一个函数画一个圆,或者先将它blit到一个新的表面,然后在屏幕表面上blit。

如果您有更复杂的曲面 - 曲线、文本等,则不需要为此设置曲面,因此您不必进行任何昂贵的计算,只需绘制即可。挫折是您的程序占用了更多内存,因此您必须在这两者之间进行选择。

于 2013-07-03T20:09:52.787 回答