好吧,我有一些物理对象,它们都被很好地分类,我的didBeginContact被正确触发,并完成它应该做的事情。问题是:
我有两类物体,比如球和桨......当球接触球时,球应该爆炸...足够简单..问题在于球可以同时接触2个桨...所以,不止一个didBeginContact被调用,因此超过1次爆炸发生(每个球与球接触1次)。所以我想弄清楚的问题是,如何删除/忽略所有后续如果代码已经处理了涉及原始球的碰撞,则处理与桨的接触?在开始爆炸之前从父节点中移除SKSpriteNode不会使其他联系人无效,它们仍然会得到处理...所以我该如何告诉它...嘿物理联系STUFF ......身体不再在图片中......所以把这些联系人扔掉,不要担心他们?
我想我可以在爆炸等之前明确检查父母仍然在联系人代码中有SKSpriteNode,但这似乎充其量只是克服了,虽然我想它会起作用...有没有其他/更好的方法处理这个(事情?我不得不相信有。
答案 0 :(得分:0)
当您收到联系时,请将球节点contactBitMask
的{{1}}设置为physicsBody
。我假设节点需要销毁,不需要重复使用。
这可以防止多个联系人出现在同一个节点上。
如果上述方法不起作用,您可以尝试以下方法:
0
或SKSpriteNode
,并为例如添加属性。 SKPhysicsBody
。然后,您可以在联系人委托中检查并设置属性。答案 1 :(得分:0)
如果您有三个物理实体(ball
,paddle1
和paddle2
)和ball
设置为与拨片碰撞(但拨片不会相互碰撞)和在同一更新周期中,球与2个桨碰撞,然后游戏引擎将生成2个单独的SKPhysicsContact
个对象 - ball
& paddle1
和ball
& paddle2
。
didBegincontact
(Swift2)或didBegin(contact:)
(Swift 3)(简称为dBC)将在同一update()
周期内被调用两次,即在调用之间将有两次调用dBC至update()
- 首先是SKPhysicsContact
与ball
之间的paddle1
ball
然后paddle2
和{}之间的联系ball.removeFromParent()
。您可以在第一次接触时执行ball
,并且球将从节点树中删除,但这不会阻止第二次调用d paddle2
& ball
碰撞,您可能会针对SKSPriteNode
执行相同的操作(爆炸,删除分数等)。
最简单的方法是为您的球创建ballNode
的子类(isActive
?)并添加一个属性true
,初始化为isActive
。这很容易。
在dBC中,当球击中球拍时,请检查其false
属性,如果return
,则只需检查true
。如果是ball.isActive
,请执行正常的碰撞操作,然后将dBC
设置为false。当第二次调用isActive
时,对userData
的检查将阻止任何重复操作。
您还可以使用球SKSpriteNode
(isActive
的一部分)来存储$(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>
还有其他方法可以解决这个问题,但到目前为止,我发现这个问题可以解决,并且最简单。