我正在学习pygame
并想要一个带有三种状态的按钮的图形:正常,悬停和按下。我有一个像这样的图像...
...我希望使用其中的一部分获得新的Surface
。
我正在使用以下代码加载图片:
buttonStates = pygame.image.load(os.path.join('image','button.png'))
如何仅使用该图形的一部分制作新曲面?
答案 0 :(得分:29)
cropped = pygame.Surface((80, 80))
cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))
表面上的blit方法“粘贴”另一个表面。 blit的第一个参数是源表面。第二个是要粘贴的位置(在这种情况下,左上角)。第三个(可选)参数是要粘贴的源图像的区域 - 在这种情况下,从顶部开始是80x80平方30px,从左边开始是30px。
答案 1 :(得分:3)
有两种可能。
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))
答案 2 :(得分:0)
您还可以使用pygame.Surface.subsurface
方法创建与其父曲面共享像素的子表面。但是,您必须确保矩形位于图像区域内,否则将引发ValueError: subsurface rectangle outside surface area
。
subsurface = a_surface.subsurface((x, y, width, height))
答案 3 :(得分:-1)
我认为最好的方法是在外部程序中裁剪这3种按钮的图像并加载到不同的表面而不是使用pygame来裁剪它