我正在学习pygame
,想为按钮设计三种状态:正常、悬停和按下。我有一张像这样的图片...
...我想使用其中的一部分来获取一个新的Surface
。
我正在使用以下代码加载图像:
buttonStates = pygame.image.load(os.path.join('image','button.png'))
我怎样才能使用图形的一部分来创建一个新的表面?
cropped = pygame.Surface((80, 80))
cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))
Surface的blit方法可以将另一个Surface“粘贴”到其上。 blit的第一个参数是源Surface,第二个参数是要粘贴到的位置(在本例中为左上角)。第三个(可选)参数是要从中粘贴源图像的区域--在这种情况下是从左上角起30px处开始的80x80正方形。
pygame.Surface.subsurface
方法创建与父表面共享像素的子表面。但是,你必须确保矩形在图像区域内,否则会引发ValueError: subsurface rectangle outside surface area
错误。subsurface = a_surface.subsurface((x, y, width, height))
有两种可能性。
blit
方法允许指定源_Surface的矩形子区域:
[...] 还可以传递一个可选的区域矩形。这表示要绘制的源 Surface 的较小部分。[...]
通过这种方式,您可以直接将源表面的区域 blit
到目标表面上:
cropped_region = (x, y, width, height)
target.blit(source_surf, (posx, posy), cropped_region)
或者,您可以使用subsurface
方法定义一个与源表面直接链接的子表面:
返回与其新父级共享像素的新表面。新表面被认为是原始表面的子代。对任一表面像素的修改都会互相影响。
一旦创建了子表面,它随时可以像普通表面一样使用:
cropped_region = (x, y, width, height)
cropped_subsurf = source_surf.subsurface(cropped_region)
target.blit(cropped_subsurf, (posx, posy))
我认为最好的方法是在外部程序中裁剪这3种按钮的图像,并加载到不同的表面,而不是使用pygame来裁剪它