21

我正在学习pygame并想要一个具有三种状态的按钮图形:正常、悬停和按下。我有一个像这样的图像......

三个按钮状态,垂直堆叠

...我想Surface用它的一部分来获得一个新的。

我正在使用以下代码加载图像:

 buttonStates = pygame.image.load(os.path.join('image','button.png'))

如何仅使用该图形的一部分制作新表面?

4

4 回答 4

38
cropped = pygame.Surface((80, 80))
cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))

表面上的 blit 方法将另一个表面“粘贴”到其上。blit 的第一个参数是源表面。第二个是粘贴到的位置(在本例中为左上角)。第三个(可选)参数是要粘贴的源图像的区域——在本例中是一个 80x80 正方形,距离顶部 30 像素,距离左侧 30 像素。

于 2011-06-04T23:50:04.487 回答
8

您还可以使用该pygame.Surface.subsurface方法创建与其父表面共享像素的子表面。但是,您必须确保 rect 在图像区域内,否则 aValueError: subsurface rectangle outside surface area将被提升。

subsurface = a_surface.subsurface((x, y, width, height))
于 2018-06-14T15:05:59.930 回答
3

有2种可能性。

blit方法允许指定源 _Surface 的矩形子区域:

[...] 也可以传递一个可选的区域矩形。这表示要绘制的源 Surface 的较小部分。[...]

通过这种方式,您可以blit将源表面的一个区域直接放到目标上:

cropped_region = (x, y, width, height)
traget.blit(source_surf, (posx, posy), cropped_region)

或者,您可以使用以下方法定义直接链接到源表面的子表面subsurface

返回一个与其新父级共享其像素的新 Surface。新 Surface 被视为原始 Surface 的子级。对任一表面像素的修改将相互影响。

一旦创建了次表面,就可以随时将其用作法线表面:

cropped_region = (x, y, width, height)
cropped_subsurf = source_surf.subsurface(cropped_region)
traget.blit(cropped_subsurf, (posx, posy))
于 2021-01-08T11:02:13.590 回答
-1

我认为最好的方法是在外部程序中裁剪这三种按钮的图像并加载到不同的表面,而不是使用 pygame 来裁剪它

于 2017-08-30T23:17:43.503 回答