1

好的,我有一些物理对象,它们都被很好地分类,并且我的 didBeginContact 被正确触发,并且做了它应该做的事情。问题是这样的:

我有两类物体,比如球和桨……当球碰到桨时,球应该爆炸……很简单……问题在于球可以同时接触 2 个桨……所以,不止一个 didBeginContact 被调用,因此发生了不止 1 次爆炸(每个球接触的桨 1 次)。所以我想弄清楚的问题是,如何删除/忽略所有后续与桨的接触如果代码已经处理了涉及原始球的碰撞,则不会被处理?在开始爆炸之前从父级移除 SKSpriteNode 不会使其他联系人无效,它们仍然会被处理......所以我该怎么说......嘿,物理联系人的东西......那个身体不再在图片中......所以只是把那些联系人扔掉,不要担心他们?

我想我可以在进行爆炸等之前明确检查父级在联系代码中是否仍然有可用的 SKSpriteNode ,但这似乎充其量是笨拙的,尽管我认为它会起作用......还有另一种/更好的方法来处理这个吗?我必须相信有。

4

2 回答 2

0

获得联系的那一刻,contactBitMask将球节点的设置physicsBody0。我假设节点需要被销毁并且不需要被重用。

这应该可以防止同一节点出现多个联系人。

如果以上方法都不起作用,您可以尝试以下方法:

  1. 从接触代理中的父节点移除节点,并随后触发爆炸动画。
  2. 子类SKSpriteNodeSKPhysicsBody用于球节点并为例如添加一个属性。alreadyTouched. 然后,您可以从联系人委托中检查和设置属性。
于 2013-12-31T09:50:44.067 回答
0

如果您有 3 个physicsBodies ( ball,paddle1paddle2) 并ball设置为与球拍碰撞(但球拍不会相互碰撞)并且球在同一更新周期内与 2 个球拍碰撞,那么游戏引擎将生成 2 个单独的SKPhysicsContact对象 - ball&paddle1ball& paddle2

didBegincontact(Swift2) 或didBegin(contact:)(Swift 3) (dBC) 将在同一个update()周期内被调用两次,即在调用之间将有 2 次对 dBC 的调用update()- 首先是&SKPhysicsContact之间的联系,然后是 & 之间的联系。您可以在第一次接触期间这样做,球将从节点树中删除,但这不会阻止第二次调用 dBC 进行&碰撞,您可能会执行相同的操作(爆炸、删除分数等)。ballpaddle1ballpaddle2ball.removeFromParent()ballpaddle2ball

最简单的做法是SKSPriteNode为你的球创建一个子类 ( ballNode?) 并添加一个属性isActive,初始化为true. 这很容易。

在 dBC 中,当球击中球拍时,检查其isActive属性,如果 false,则简单return。如果是true,则执行正常的碰撞动作,然后设置ball.isActive为 false。当dBC第二次调用时,检查isActive将防止任何重复的操作。

如果您愿意,也可以使用球的userData(部分SKSpriteNode)来存储isActive值以防止子类化。

还有其他方法可以处理这个问题,但到目前为止,我发现这个方法可以工作并且是最简单的。

于 2016-12-15T09:34:48.137 回答