gpt4 book ai didi

python - 如何获得没有透明部分的 pygame Surface 的矩形?

转载 作者:行者123 更新时间:2023-11-30 22:01:38 25 4
gpt4 key购买 nike

我正在实现碰撞检测,并想要检查矩形物体是否正在接触玩家。我的墙使用 .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 的 block 。背景颜色被删除,并留下 48x48 的纯色 block (即使图像大小仍然是 64x64)。

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

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

对此的任何帮助将不胜感激:D

最佳答案

如果您想在碰撞检测中忽略透明像素,那么您正在讨论的是像素完美碰撞。

为了在 pygame 中执行此操作,pygame 提供了 Mask类(class)。您通常使用 pygame.mask.from_surface 创建 mask 。并与 pygame.sprite.spritecollide 一起使用和 pygame.sprite.collide_mask .

也许考虑使用 pygame 的 Sprite类以利用它提供的所有功能。

即使你不想使用 pygame 的内置碰撞检测,你也可以看看 source看看它是如何工作的。

关于python - 如何获得没有透明部分的 pygame Surface 的矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53991988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com