与blitting有点混淆(Pygame)

时间:2013-07-03 17:13:27

标签: python pygame blit

我刚开始学习一些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应该做什么,除了将所需的表面“粘贴”到屏幕上。我希望我已经足够清楚了。

3 个答案:

答案 0 :(得分:41)

简答

  

我还没有找到一个可以解释我何时需要blit或者不在屏幕上包含某个表面的地方。

每个操作的行为都不同,您需要阅读您正在使用的函数的文档。

答案很长

什么是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() documentation

  

在新Surface上绘制文字

     

渲染(文字,抗锯齿,颜色,背景=无) - >表面

     

这会创建一个新的Surface,并在其上呈现指定的文本。 Pygame无法直接在现有Surface上绘制文本:相反,您必须使用Font.render()创建文本的图像(Surface),然后将此图像blit到另一个Surface上。   ...

正如您所看到的,它特别指出文本是在新曲面上绘制的,创建并返回给您。这个表面不是你屏幕的表面(它不可能,你甚至没有告诉render()函数你的屏幕表面是什么)。这是一个非常好的迹象,你需要实际将这个表面blit到屏幕上。

答案 1 :(得分:11)

Blit意味着'BL'ock'我想'T'ranfser

当您在屏幕上显示内容时,您将以某种方式使用screen,因为这是您放置它的位置。

当你这样做时:

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

你还在使用屏幕,但你不是因为pygame正在为你画画而不是blitting。

当你使用文本时,pygame会将它渲染成图像,然后你必须将其搞定。

所以基本上你是blit图像,但你也可以让pygame为你画画。但是请记住,当你在背景中显示图像时,你需要将其环回第四个;这样它会使背景,然后是图像,然后是背景等... ...

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

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

答案 2 :(得分:2)

想象一下你是画家:

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

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

当你调用blit时,你在表面的顶部上绘制,覆盖任何重叠的像素。这就是为什么你需要将整个屏幕重绘为黑色,以便在移动物体时不会对画面产生任何污迹。

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

如果你有一个更复杂的曲面 - 曲线,文本等,你不需要有一个表面,所以你不必做任何昂贵的计算,只需绘图。挫折是你的程序占用更多的内存,所以你必须在那两个之间做出选择。