<p>根据提供的信息,<sup>(a)</sup>,没有明显的原因说明第二次碰撞检查失败的原因。如果(例如)敌方7号导弹和敌方3号导弹发生碰撞,则3号导弹和敌方7号导弹也应该发生碰撞</p>
<p>您没有使用任何像提供您自己的(可能是非交换的)碰撞函数这样的边缘情况,因此它只会使用精灵矩形来检测这个</p>
<p>我很想看看当你把代码中两个循环的顺序颠倒过来时的行为</p>
<hr/>
<p>此外,还应指定这些组变量的类型。如果<code>enemyGroup</code>类似于一个可耗尽的生成器而不是一个列表,那么它将被第一个循环“清空”,然后第二个循环将没有可迭代的项(b)</sup>(调用<code>spritecollide</code>将迭代组以对照精灵检查每个项)</p>
<p>除了<code>spritecollide</code>本身的bug之外,这是唯一一种可以看到您所描述的效果的方法</p>
<hr/>
<p>作为示例,这里有一段代码尝试在生成器上迭代两次:</p>
<pre class="lang-py prettyprint-override"><code>class gen3(object):
def __init__(self): self._num = 0
def __iter__(self): return self
def __next__(self):
if self._num == 3: raise StopIteration()
self._num += 1
return self._num - 1
gen = gen3()
print("A: ")
for i in gen: print(" ", i)
print("B: ")
for i in gen: print(" ", i)
</code></pre>
<p>输出显示第二个循环不执行任何操作:</p>
<pre class="lang-none prettyprint-override"><code>A:
0
1
2
B:
</code></pre>
<hr/>
<p>最后,检查组状态的确定方法是在每个循环之前简单地放置以下代码:</p>
<pre class="lang-py prettyprint-override"><code>print("loop X enemy ", len(enemyGroup), enemyGroup)
print("loop X missile", len(missileGroup), missileGroup)
</code></pre>
<p>使用合适的<code>X</code>值来区分这两个循环</p>
<hr/>
<p><sup>(a)</sup>当然,总有一种可能性<em>你提供的信息不完全准确或不完整(没有恶意意图,但有时人们会无意中跳过他们认为<em>不重要的细节,最终变得非常重要)</p>
<p>示例:<em>这两个循环之间可能发生了导致问题的事情。我更愿意让人们相信这种怀疑,但如果是这样的话,你可能应该让我们知道</p>
<hr/>
<p><sup>(b)</sup>它实际上会在第一个循环的第一次<em>迭代</em>中被清空,所以你会发现它可能只会与第一枚导弹匹配</p>