与blitting有点混淆(Pygame)

Pab*_*bce 23 python pygame blit

我刚开始学习一些pygame(整体编程很新),我有一些关于它是如何工作的非常基本的问题.

我还没有找到一个地方解释我何时需要blit或不在屏幕上包含某个表面.例如,绘制圆形时:

circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)
Run Code Online (Sandbox Code Playgroud)

我不需要这样做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)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*eth 49

简短的回答

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

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

答案很长

什么是Blitting?

首先,你需要意识到blitting在做什么.您的屏幕只是一组像素,blitting正在将一组像素完整复制到另一组像素上.例如,您可以在表面上显示从硬盘驱动器加载的图像,并且可以通过在表面顶部screen多次打印该表面,在屏幕上以不同的位置多次显示该图像.

所以,你经常有像这样的代码......

my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)
Run Code Online (Sandbox Code Playgroud)

在两行代码中,我们通过"blitting"将源表面(my_image)中的大量像素复制到屏幕上.

pygame.draw.*函数怎么搞blit?

从技术上讲,可以编写pygame.draw.*方法来做类似的事情.所以,而不是你的例子......

pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)
Run Code Online (Sandbox Code Playgroud)

......他们可能已经让你这样做了......

circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,您将获得相同的结果.但是,在内部,该pygame.draw.circle()方法直接操作传递给它的曲面,而不是创建新曲面.这可能被选择作为执行操作的方式,因为它们可以比创建新曲面更快或更少内存运行.

那我该怎么办?

因此,对于"何时快速"和"什么时候不"的问题,基本上,您需要阅读文档以了解函数的实际功能.

这是pygame.draw.circle()文档:

pygame.draw.circle():

围绕一个点画一个圆圈

circle(Surface,color,pos,radius,width = 0) - > Rect

在Surface上绘制圆形.pos参数是圆的中心,radius是大小.width参数是绘制外边缘的粗细.如果宽度为零,则圆圈将被填充.

请注意,它表示"在表面上绘制一个形状",因此它已经为您完成了像素更改.此外,它不会返回一个曲面(它返回一个Rect,但它只是告诉你像素更改的位置).

现在让我们看一下pygame.font.Font.render()文档:

在新Surface上绘制文本

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

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

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


Ser*_*ial 12

Blit意味着'BL'ock'Illmage'T'ranfser

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

当你这样做时:

pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我希望这有帮助.祝好运!