我正在检查导弹群,看看是否有导弹与敌人群中的敌人发生碰撞。运行时,它为第一个循环打印“命中”,但忽略第二个循环。为什么呢
#### Imagine this is in a game loop ####
for missile in missileGroup:
if pygame.sprite.spritecollide(missile, enemyGroup, False) :
print("Hit")
for enemy in enemyGroup:
if pygame.sprite.spritecollide(enemy, missileGroup, False):
print("HI")
更新:@rabbi76声明spritecollide
不起作用,因为精灵组enemyGroup
是一个组(enemyGroup<;-enemyList<;-敌军(sprite))中的精灵列表,而不是一组精灵(enemyGroup<;-敌军(sprite))。我该如何访问它
更新2@paxdiablo声明第一个循环可能在迭代后清空组。我切换了循环的位置,第二个循环运行,而第一个循环没有
update3在完整的代码中,.reset()
方法运行.kill()
,从组中删除精灵。由于第一个循环在第二个循环检测不到任何碰撞之前移除导弹精灵:
for missile in missileGroup:
if pygame.sprite.spritecollide(missile, enemyGroup, False) :
missile.reset()
for eachEnemy in enemyGroup:
if pygame.sprite.spritecollide(eachEnemy, missileGroup, False):
eachEnemy.reset()
下面是一个快速的例子,表明(在PyGame 1.9.6中)这种报告的行为不会发生
该示例创建两个sprite groups,然后以与OP示例代码相同的方式碰撞它们
与打印一样,精灵也会从大纲->;填充,取决于他们是否认为自己参与了碰撞。有一个1:1的敌人与导弹相撞的地图,反之亦然
抱歉帧速率太低。。。![collision_demo](https://i.stack.imgur.com/Om1Zx.gif)
根据提供的信息,(a),没有明显的原因说明第二次碰撞检查失败的原因。如果(例如)敌方7号导弹和敌方3号导弹发生碰撞,则3号导弹和敌方7号导弹也应该发生碰撞
您没有使用任何像提供您自己的(可能是非交换的)碰撞函数这样的边缘情况,因此它只会使用精灵矩形来检测这个
我很想看看当你把代码中两个循环的顺序颠倒过来时的行为
此外,还应指定这些组变量的类型。如果
enemyGroup
类似于一个可耗尽的生成器而不是一个列表,那么它将被第一个循环“清空”,然后第二个循环将没有可迭代的项(b)(调用spritecollide
将迭代组以对照精灵检查每个项)除了
spritecollide
本身的bug之外,这是唯一一种可以看到您所描述的效果的方法作为示例,这里有一段代码尝试在生成器上迭代两次:
输出显示第二个循环不执行任何操作:
最后,检查组状态的确定方法是在每个循环之前简单地放置以下代码:
使用合适的
X
值来区分这两个循环(a)当然,总有一种可能性你提供的信息不完全准确或不完整(没有恶意意图,但有时人们会无意中跳过他们认为不重要的细节,最终变得非常重要)
示例:这两个循环之间可能发生了导致问题的事情。我更愿意让人们相信这种怀疑,但如果是这样的话,你可能应该让我们知道
(b)它实际上会在第一个循环的第一次迭代中被清空,所以你会发现它可能只会与第一枚导弹匹配
见^{} :
因此} 对象和^{} 对象。
spritecollide()
的参数必须是^{用
pygame.sprite.Sprite
对象列表代替组不起作用进一步了解^{}
因此,如果在第一个循环中调用
kill()
,第二个循环将不起作用,因为精灵将从所有组中移除在}导致第二个循环失败
reset
方法中调用kill()
missile.reset()
分别{相关问题 更多 >
编程相关推荐