首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有点混淆了blitting (Pygame)

有点混淆了blitting (Pygame)
EN

Stack Overflow用户
提问于 2013-07-04 01:13:27
回答 3查看 45.7K关注 0票数 27

我刚刚开始学习一些pygame (完全是编程新手),我对它是如何工作的有一些非常基本的问题。

我还没有找到一个地方来解释什么时候我需要在屏幕上包含某个特定的表面。例如,在绘制圆时:

代码语言:javascript
复制
circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

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

代码语言:javascript
复制
text = font.render("TEXT", 1, (10, 10, 10)) 
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)

如果我不涂鸦,文本就不会出现。

老实说,除了把想要的界面“粘贴”到屏幕上之外,我真的不知道blitting应该做什么。我希望我已经讲得足够清楚了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-04 03:30:15

简短的回答

我还没有找到一个地方来解释什么时候我需要在屏幕上包含某个特定的表面。

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

冗长的答案

什么是Blitting?

首先,你需要认识到blitting是做什么的。你的屏幕只是一个像素的集合,而blitting就是将一组像素复制到另一组上。例如,您可以拥有一个包含从硬盘驱动器加载的图像的曲面,并且可以通过在screen曲面顶部多次拖动该曲面,在屏幕上的不同位置多次显示该图像。

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

代码语言:javascript
复制
my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)

在两行代码中,我们通过“by”将大量像素从源表面(my_image)复制到屏幕上。

pygame.draw.*函数是如何blit的?

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

代码语言:javascript
复制
pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)

...they可以让你这么做..。

代码语言:javascript
复制
circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)

如果是这样的话,你会得到同样的结果。不过,在内部,pygame.draw.circle()方法直接操作您传递给它的曲面,而不是创建新曲面。这可能会被选为做事情的方式,因为他们可以让它运行得更快,或者比创建一个新的表面占用更少的内存。

那么我该怎么做呢?

因此,对于您提出的“何时blit”和“何时不blit”的问题,基本上,您需要阅读文档以了解函数的实际作用。

以下是pygame.draw.circle()文档:

pygame.draw.circle():

在一个点周围画一个圆

圆(曲面、颜色、位置、半径、width=0) ->矩形

在曲面上绘制圆形。pos参数是圆的中心,半径是圆的大小。width参数是绘制外边的厚度。如果宽度为零,则圆将被填充。

请注意,它显示“在表面上绘制一个形状”,因此它已经为您完成了像素更改。而且,它不返回一个表面(它返回一个Rect,但它只告诉你像素的变化发生在哪里)。

现在让我们看一下pygame.font.Font.render() documentation

在新表面上绘制文本

渲染(文本、抗锯齿、颜色、background=None) ->表面

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

正如您所看到的,它特别说明了文本是在一个新的Surface上绘制的,该Surface被创建并返回给您。这个表面不是你的屏幕表面(它不可能是,你甚至没有告诉render()函数你的屏幕的表面是什么)。这是一个很好的指示,表明您将需要实际将此表面斑点到屏幕上。

票数 55
EN

Stack Overflow用户

发布于 2013-07-04 01:20:35

Blit的意思是‘BL’‘ock’I‘’mage‘T’‘ranfser

当您在屏幕上显示内容时,在某种程度上,您将使用screen,因为它就是您要放置它的地方。

当你这样做的时候:

代码语言:javascript
复制
pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

你仍然在使用screen,但你只是不再使用它,因为pygame正在为你绘制它。

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

所以基本上你可以使用blit图像,但你也可以让pygame为你绘制它们。但请记住,当你对一个图像进行blit时,比如说在背景上,你需要将它循环一遍又一遍;这样它就会对背景进行blit,然后是图像,然后是背景,等等。

你不需要知道更多,但你可以在这里阅读所有关于它的Pygame Blit

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

票数 12
EN

Stack Overflow用户

发布于 2013-07-04 04:09:53

假设你是一名画家:

你有一块画布和一把刷子。

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

调用blit时,在曲面的顶部上绘制,覆盖任何重叠的像素。这就是为什么你需要将整个屏幕重新刷成黑色,这样当你移动一个物体时,你不会在画上有任何污点。

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

如果你有一个更复杂的曲面-曲线,文本等,你不需要有一个曲面,所以你不需要做任何昂贵的计算,只需绘图即可。倒退是你的程序占用了更多的内存,所以你必须在这两个中选择一个。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17454257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档