首页 > 解决方案 > 如何仅从加载的图像的一部分制作 pygame 表面对象?

问题描述

来自多精灵图像的像素完美碰撞

我想做像素完美的碰撞检查。我有一个带有透明背景的PNG格式的6帧精灵,但它们都在一个精灵表上。(“敌人”精灵每个有 2 帧。)我可以为它们设置动画并很好地移动它们。

如何仅从加载的图像的一部分制作pygame 表面对象?我想我可以单独加载每个精灵帧,但这很费力,而且看起来不像是好的编码。

更多信息

我可以很容易地将整个 spritesheet 变成一个掩码,如下所示(最初在 spritesheet 类中,但在这里进行了简化):

# Load image
sheet = pygame.image.load("spritesheet.png")
# Create mask
sheet_mask = pygame.mask.from_surface(sheet)

我可以简单地使用当前帧的矩形来检测碰撞,但这会非常不令人满意,因为有时碰撞似乎会在没有接触的情况下发生。一个 pygame 为这类事情提供了这个美妙的掩码对象。

在主游戏循环的每个循环中,我想检查一个精灵的适当帧与另一个精灵的适当帧。我一直在尝试为每个帧创建一个蒙版,然后将它们存储在一个列表中。

标签: pythonpython-3.xpygamebitmasksprite-sheet

解决方案


使用subsurface()方法从 a 获得一个矩形次表面pygame.Surface

sheet = pygame.image.load("spritesheet.png")

rect_area = pygame.Rect(left, top, width, heigth)
sprite_from_sheet = sheet.subsurface(rect_area)

推荐阅读