我正在使用 pygame 创建俄罗斯方块。我想使用碰撞检测,以便当游戏中的形状与之前播放的任何其他形状接触时,我可以按照俄罗斯方块的逻辑停止该形状。我遇到了使用蒙版的像素完美碰撞。我已经在线学习了一些教程,但是每次出现新形状时像素检测都会返回 true,而不是任何形状发生碰撞时。对于长代码提前抱歉,它是代码实际并且仍然包含它的游戏元素的最低限度。我认为我的方法有问题导致了这个错误。我基本上有一个功能,每当游戏中的形状与“地板”接触时,该形状就会保持在该位置并创建一个新形状。我认为我把它复杂化了,反过来又造成了这个错误。
1 回答

慕妹3146593
TA贡献1820条经验 获得超9个赞
问题是您没有更新精灵rect
属性。精灵rect
都具有位置 (0, 0)(因为您没有在对 的调用中设置它self.image.get_rect()
),因此蒙版将全部重叠和碰撞。
如果您阅读pygame.sprite.collide_mask的文档,您会注意到它说您的精灵需要具有mask
和rect
属性。您的 sprite 中有一个rect
,并将其设置在 中__init__()
,但是当您移动 sprite 时,它不会保持更新。您只需更改x
和y
属性而无需调整rect
位置。collide_mask
想要 a的原因rect
是它使用它来确定它使用的pygame.mask.Mask.overlap()offset
调用的参数。重要的是要意识到面具本身没有位置,他们需要 s来确定面具的相对位置。rect
这类似于没有位置并且需要rect
为它们跟踪的图像/表面。
在一个单独的问题上,您将精灵发送到屏幕的方式毫无意义。您没有使用 sprite 组的能力进行绘制,更糟糕的是,您将 sprite 的图像、x 和 y 保存在单独的列表中,而不将其包含在 sprite 本身中。
添加回答
举报
0/150
提交
取消