SKPhysicsContact当对象与多个对象碰撞时,首先处理,忽略所有其他对象..如何?

时间:2013-12-31 05:52:10

标签: sprite-kit skspritenode skphysicsbody

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

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

我想我可以在爆炸等之前明确检查父母仍然在联系人代码中有SKSpriteNode,但这似乎充其量只是克服了,虽然我想它会起作用...有没有其他/更好的方法处理这个(事情?我不得不相信有。

2 个答案:

答案 0 :(得分:0)

当您收到联系时,请将球节点contactBitMask的{​​{1}}设置为physicsBody。我假设节点需要销毁,不需要重复使用。

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

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

  1. 从联系人委托中的父级删除节点,然后触发爆炸动画。
  2. 球节点的子类0SKSpriteNode,并为例如添加属性。 SKPhysicsBody。然后,您可以在联系人委托中检查并设置属性。

答案 1 :(得分:0)

如果您有三个物理实体(ballpaddle1paddle2)和ball设置为与拨片碰撞(但拨片不会相互碰撞)和在同一更新周期中,球与2个桨碰撞,然后游戏引擎将生成2个单独的SKPhysicsContact个对象 - ball& paddle1ball& paddle2

didBegincontact(Swift2)或didBegin(contact:)(Swift 3)(简称为dBC)将在同一update()周期内被调用两次,即在调用之间将有两次调用dBC至update() - 首先是SKPhysicsContactball之间的paddle1 ball然后paddle2和{}之间的联系ball.removeFromParent()。您可以在第一次接触时执行ball,并且球将从节点树中删除,但这不会阻止第二次调用d paddle2& ball碰撞,您可能会针对SKSPriteNode执行相同的操作(爆炸,删除分数等)。

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

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

您还可以使用球SKSpriteNodeisActive的一部分)来存储$(document).ready(function() { var clicks = 0; $(".next-button").click(function() { clicks++; $('.figure').html(clicks); }); console.log(clicks); if (clicks == 2) { $('.next-button').click(function() { var nextTab = $('ul.tabs div.orange-tab.current').next(); $('ul.tabs div.orange-tab').removeClass('current'); $('div.tab-content').removeClass('current'); nextTab.addClass('current'); $('div[id=' + nextTab.attr('data-tab') + ']').addClass('current'); }); } else { //function to hide the button } }); 值以防止子类化,如果您愿意的话。< / p>

还有其他方法可以解决这个问题,但到目前为止,我发现这个问题可以解决,并且最简单。