我有一个球节点和一个洞节点。我想知道球什么时候会落入保持状态。
目前我正在使用didBeginContact,但它只在接触开始时给我两个节点的距离,在这种情况下,球不一定会落入洞中(当两个中心之间的距离时,它会下降...半径)。
有没有办法在接触发生后跟踪球的位置?
答案 0 :(得分:1)
您可以添加隐身SKSpriteNodes
并跟踪球何时接触它们。在进入洞之前,你会在洞的顶部(球必须穿过的区域 - 或者在进入洞之前触摸)node1
,然后在洞之后node2
,球进入洞后必须经过 - 或触摸 - 的区域。
如果球接触node1
但不接触node2
,你知道它几乎进入了洞,但后来却没有。如果球接触node2
,你知道球正试图从底部穿过洞。
答案 1 :(得分:0)
我猜你可以让一个洞的物理体小得多。这样,当发生接触时,您将确保球可以落入洞中。看一下这张照片(第二个例子):
除此之外,作为一个额外的想法,当检测到接触时,你可以让球稍微移动,然后缩小它以留下掉落的印象。
答案 2 :(得分:0)
没有必要测试球和洞之间的接触,因为它没有告诉你目标是否完成。或者,您可以在didSimulatePhysics
中添加一个检查,以便在开始下降动画序列之前查看球是否足够靠近洞。例如,
override func didSimulatePhysics() {
let dx = ball.position.x - hole.position.x
let dy = ball.position.y - hole.position.y
let distance = sqrt(dx*dx+dy*dy)
if (distance < hole.size.width / 2.0) {
// Start falling animation sequence
}
}
或者,您可以通过
测试球是否移动得足够快以跳过洞override func didSimulatePhysics() {
let dx = ball.position.x - hole.position.x
let dy = ball.position.y - hole.position.y
let distance = sqrt(dx*dx+dy*dy)
if (distance < hole.size.width / 2.0) {
// Check if the ball is moving fast
let vx = ball.physicsBody!.velocity.dx
let vy = ball.physicsBody!.velocity.dy
let speed = sqrt(vx*vx+vy*vy)
if (speed < minSpeedToSkipOverHole) {
// Start falling animation sequence
}
}
}
答案 3 :(得分:0)
这个问题通过以下方法解决:我为每个球保留了所有接触孔的可能_falling_list,并使用另一个计时器来经常检查球是否落入任何球洞。由于每个球的列表很小,因此性能不是问题。