如何得到一个没有透明部分的pygame曲面的rect?

2024-05-15 10:42:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在执行碰撞检测,并想检查是否有一个矩形物体接触到播放器。我的墙使用.set_colorkey(background),其中background是指定的背景色。问题是,当我用.get_rect()得到墙的矩形时,它得到的是完整图像的大小,其中包括透明部分,而不仅仅是不透明部分。在

我想让墙图像文件的大小更小,以删除背景,但这将是不方便的,因为我将需要这样做的每一个部分透明的图像。我还考虑过使用数组来获取颜色,并检查它是否与背景颜色匹配,然后从那里获得矩形的大小,但这将是缓慢和繁琐的。在

for x, y in ((i, j) for i in land_x for j in land_y):
# land_x, land_y hold the tiles to be checked
    try:
        tx1, ty1, tx2, ty2 = \
             texture[land[y][x]].get_rect()
        # tx1, ty1 coordinates of top-left corner
        # tx2, ty2 width and height respectively
        if tx2 == 0 and ty2 == 0:
            continue    # skip to other objects
        tx1 = x*64 - tx2/2
        ty1 = y*64 - ty2/2
        px1, py1, px2, py2 = \
             PLAYER.get_rect()
        px1 = player_x - px2/2
        py1 = -player_y - py2/2
        if p.Rect(px1, py1, px2, py2).colliderect(
            p.Rect(tx1, ty1, tx2, ty2)
        ):
            player_x -= direction_x
            break    # go outside loop to start checking y
    except IndexError:    # incase player is outside map
        pass    # skip to other objects

.get_rect()输出一个整个图像大小的矩形,而我想要一个不包括透明部分的矩形。在

示例: texture是一个64x64图像,中间有一个48x48块。 背景色被移除,留下一个48x48纯色块(即使图像大小仍然是64x64)。在

预期产量: texture.get_rect()应输出大小为48x48的矩形。在

实际产量: texture.get_rect()而是输出一个64x64大小的矩形。在

如有任何帮助,将不胜感激


Tags: toinrect图像forgetplayer矩形
2条回答

你把事情搞得太难了。你知道你的东西有多大。在创建时为每个对象添加一个较小的碰撞矩形,并将其用于碰撞。或者用一个圆,如果这是更好的对象。在

tile.crect = Rect(whatever)

或者将现有的矩形尺寸乘以碰撞矩形的某个比例因子。不要做所有这些计算。为每个可碰撞对象存储一个Rect,并为玩家创建一个Rect。在

^{pr2}$

然后直接测试碰撞:

for t in tiles:
    if player.rect.colliderect( t.rect ):

如果玩家是精灵,它的矩形移动。查看文档中的示例代码。在

https://www.pygame.org/docs/ref/sprite.html

如果你想忽略碰撞检测中的透明像素,那就是像素完美碰撞。在

为了在pygame中实现这一点,pygame提供了^{}类。通常使用^{}创建掩码,并将其与^{}和{a4}一起使用。在

也许可以考虑使用pygame的^{}类来利用它提供的所有特性。在

即使您不想使用pygame的内置冲突检测,也可以查看一下source来了解它是如何工作的。在

相关问题 更多 >