我刚开始学习一些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应该做什么,除了将所需的表面“粘贴”到屏幕上。我希望我已经足够清楚了。
答案 0 :(得分:41)
我还没有找到一个可以解释我何时需要blit或者不在屏幕上包含某个表面的地方。
每个操作的行为都不同,您需要阅读您正在使用的函数的文档。
首先,您需要了解blitting正在做什么。您的屏幕只是一组像素,blitting正在将一组像素完整复制到另一组像素上。例如,您可以在表面上显示从硬盘驱动器加载的图像,并且可以通过多次在screen
曲面顶部的表面进行布局,在屏幕上多次显示它。
所以,你经常有这样的代码......
my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)
在两行代码中,我们通过“blitting”将源表面(my_image)中的大量像素复制到屏幕上。
从技术上讲,可能已经编写了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。
如果你有一个更复杂的曲面 - 曲线,文本等,你不需要有一个表面,所以你不必做任何昂贵的计算,只需绘图。挫折是你的程序占用更多的内存,所以你必须在那两个之间做出选择。