了解碰撞列表中哪个矩形发生了碰撞

问题描述 投票:0回答:3

当我的子弹接触到矩形时,我试图在碰撞列表中找到特定的矩形。 我有 92 个矩形,每个矩形都有一个类型:“不透明”、“透明”。 当我在游戏启动时创建矩形时,我将它们放在一个列表中,以便在测试碰撞列表后进行。另一个列表按顺序包含所有类型。 喜欢

collide_wall_list = [rect,rect,rect,rect]
#Each rect is a pygame.draw.rect

wall_type_list = ["Opaque","Opaque","Opaque","Transparent"]

它们是按顺序创建的,因此第二个矩形是第二种类型。

if new_bullet_list[n].collidelist(collide_wall_list) != -1:

这是为了测试我的子弹是否与矩形列表相碰撞。 现在的问题是,使用碰撞列表,我们无法知道哪些矩形正在发生碰撞。 您知道如何知道哪些矩形正在发生碰撞吗?然后对于类型来说就很容易了,因为矩形和类型位于相同的位置。

python pygame collision-detection collision
3个回答
2
投票

collidelist 返回第一次碰撞的索引,如果没有发生碰撞则返回 -1:

“测试矩形是否与矩形序列中的任何一个发生碰撞。返回找到的第一个碰撞的索引。如果没有发现碰撞,则返回索引 -1。”

http://www.pygame.org/docs/ref/rect.html


0
投票

好吧,你显然有一个函数来检查是否发生碰撞,并返回 -1 ?我不知道。但这是我的想法;只是尝试让你的函数看起来像这样:

int IsCollision( "all your variables" + int n) { // n = the current rect's number
         if ("collision" == true) {
               return n;
            } else {
            return 0;
           }
}

当然现在你需要将另一行更改为:

if new_bullet_list[n].collidelist(collide_wall_list) != 0: //colidelist will return "n", so the number of your rectangle. If that number is not equal to zero, a collision happened with your n'th rect.

0
投票

有一种简单的方法可以实现当前版本的 Pygame 中所描述的操作,称为 collideobjects() 根据文档,它检查碰撞序列,并返回发现碰撞的第一个对象,或者如果未发现碰撞则返回 None。 https://www.pygame.org/docs/ref/rect.html#pygame.Rect.collideobjects

我想我会更新这个问题的答案,因为在搜索 Pygame 解决方案时它仍然会出现。

© www.soinside.com 2019 - 2024. All rights reserved.