好的,我有一些物理对象,它们都被很好地分类了,我的didBeginContact被正确地触发了,并且做了它应该做的事情。问题是:
我有两类物体,比方说球和桨……当球碰到球拍时,球应该会爆炸。很简单..问题在于球可以同时碰到两个球拍……因此,不止一个didBeginContact被调用,因此不止1次爆炸发生(球接触的每个球拍1次)..所以我试图弄清楚的问题是,如果代码已经处理了涉及原始球的碰撞,我如何删除/忽略所有后续的带有球拍的接触?在开始爆炸之前从父联系人中删除SKSpriteNode并不会使其他联系人无效,它们仍然会得到处理...那我该怎么说呢..嘿物理接触的东西..。那具身体已经不在照片里了。所以干脆把这些隐形眼镜扔掉,不用担心了?
我想我可以在做爆炸之前显式地检查父母的联系人代码中是否还有可用的SKSpriteNode,但这看起来充其量是笨拙的,尽管我认为它会起作用……有没有其他/更好的方法来处理这个问题?我不得不相信有。
发布于 2013-12-31 17:50:44
在获得联系人的瞬间,将球节点的physicsBody的contactBitMask设置为0。我假设节点需要销毁,并且不需要重用。
这将防止多个联系人出现在同一节点上。
如果以上方法都不起作用,您可以尝试以下方法:
从联系代理中的父节点移除节点,并为球节点触发爆炸动画subsequently.
SKSpriteNode或SKPhysicsBody,并添加一个属性,例如。alreadyTouched。然后,您可以在联系委托中检查和设置该属性。发布于 2016-12-15 17:34:48
如果您有三个physicsBodies (ball、paddle1和paddle2),并且ball设置为与球拍发生碰撞(但球拍不会相互碰撞),并且球在同一更新周期中与两个球拍发生碰撞,则游戏引擎将生成两个独立的SKPhysicsContact对象- ball & paddle1和ball & paddle2。
然后,didBegincontact (Swift2)或didBegin(contact:) (Swift 3) (简写为dBC )将在同一个update()周期内被调用两次,即在对update()的调用之间将有两次对dBC的调用-首先是针对ball和paddle1之间的SKPhysicsContact,然后是针对ball和paddle2之间的联系。您可以在第一次接触时执行ball.removeFromParent(),球将从节点树中移除,但这不会阻止针对ball & paddle2碰撞对dBC的第二次调用,并且您可能会对ball执行相同的操作(爆炸、移除分数等)。
最简单的做法是为您的球(ballNode?)创建SKSPriteNode的子类。并添加一个初始化为true的属性isActive。这非常简单。
在dBC中,当球击中球拍时,检查其isActive属性,如果为false,则只需return。如果为true,则执行正常的碰撞操作,然后将ball.isActive设置为false。当第二次调用dBC时,针对isActive的检查将防止任何重复的操作。
如果您愿意,还可以使用球的userData (SKSpriteNode的一部分)来存储isActive值,以防止子类化。
还有其他方法可以解决这个问题,但到目前为止,我发现这个方法是可行的,而且是最简单的。
https://stackoverflow.com/questions/20852473
复制相似问题