Python pyBox2D接触边缘接触过多?

Python pyBox2D接触边缘接触过多?,python,box2d,Python,Box2d,我对Box2D完全陌生,我一直在Python平台上结合pygame进行尝试 我有一颗弹跳的子弹,我的目标是当它击中一堵墙5次或击中一个敌人时,它会被摧毁 现在我正在查看访问联系人部分,上面说所有最近的联系人都可以在body.Contacts上找到。 看起来是这样,但当我的子弹只与墙壁碰撞一次时,它会给我6条接触边 我的子弹是一个圆圈,墙是一个边缘形状 # Bullet body, taken from the inside of the constructor self.body = world

我对Box2D完全陌生,我一直在Python平台上结合pygame进行尝试

我有一颗弹跳的子弹,我的目标是当它击中一堵墙5次或击中一个敌人时,它会被摧毁

现在我正在查看访问联系人部分,上面说所有最近的联系人都可以在body.Contacts上找到。 看起来是这样,但当我的子弹只与墙壁碰撞一次时,它会给我6条接触边

我的子弹是一个圆圈,墙是一个边缘形状

# Bullet body, taken from the inside of the constructor
self.body = world.CreateDynamicBody(position=pos_m, bullet=True)
self.body.CreateCircleFixture(radius=radius, density=1, friction=0.5, restitution=0.8)


# 4 walls covering the screen. top_left, top_right etc. is vectors positions
border = world.CreateStaticBody(
    position=(0, 0),
    shapes=(
        b2EdgeShape(vertices=[top_left, top_right], friction=0.3),
        b2EdgeShape(vertices=[top_right, bottom_right], friction=0.3),
        b2EdgeShape(vertices=[bottom_right, bottom_left], friction=0.3),
        b2EdgeShape(vertices=[bottom_left, top_left], friction=0.3),
    ),
)

因此,对于bullet,我将其放在了它的update方法中(在
world.step()
之外,每一步运行一次)

当子弹一打印出来就相撞的时候

contact!
contact!
contact!
contact!
contact!
contact!

为什么会这样?如何将每次碰撞限制为一次接触

编辑1: 接触的数量似乎是半随机的。每次碰撞的接触次数从6次到10次不等

编辑2: 下面是一个小测试示例:
我将Python2.7.8与pygame 1.9.2a0和Pybox2.1b1一起使用

编辑3: 当它发生碰撞时,
self.body.contacts
似乎只包含一条接触边,但它将该边保留在该列表中约6步。你是如何解决这个问题的?似乎我甚至不能从列表中删除它,
del
函数什么也不做。非常感谢您的帮助

我找到了原因!(呜呜!)

每个联系人都是整个联系人事件的一部分。这就像碰撞前后发生的小接触,但只有一个
接触\u边
值是实际碰撞

当我指的是
contact\u edge
时,我指的当然是列表
body.contacts
中的值,如中所述

因此,如果您查看中的contact对象,您可以看到其中一个属性是
触摸

当我将其应用于回路时,我看到6+个触点中只有一个触点是
接触的
,因此我可以计算它何时碰到墙壁,这就是我想要的

循环示例:

for contact_edge in body.contacts:
    if contact_edge.contact.touching:
        print('ONE collision!')

你能让这个例子运行吗?@Veedrac你这是什么意思?我不能复制你写的代码片段并运行它;因此它不能运行。通常情况下,除非删除不相关的部分后您的代码超过2页,否则您应该更喜欢可运行的代码片段。@Veedrac在那里我添加了一个游戏链接。只需在命令提示符下测试运行它,然后单击进行拍摄,然后按ESC退出。墙位于屏幕的边界处。
for contact_edge in body.contacts:
    if contact_edge.contact.touching:
        print('ONE collision!')