如何在SpriteKit中联系后跟踪节点移动

时间:2015-07-15 04:11:08

标签: swift sprite-kit

我有一个球节点和一个洞节点。我想知道球什么时候会落入保持状态。

目前我正在使用didBeginContact,但它只在接触开始时给我两个节点的距离,在这种情况下,球不一定会落入洞中(当两个中心之间的距离时,它会下降...半径)。

有没有办法在接触发生后跟踪球的位置?

4 个答案:

答案 0 :(得分:1)

您可以添加隐身SKSpriteNodes并跟踪球何时接触它们。在进入洞之前,你会在洞的顶部(球必须穿过的区域 - 或者在进入洞之前触摸)node1,然后在洞之后node2 ,球进入洞后必须经过 - 或触摸 - 的区域。

enter image description here

如果球接触node1但不接触node2,你知道它几乎进入了洞,但后来却没有。如果球接触node2,你知道球正试图从底部穿过洞。

答案 1 :(得分:0)

我猜你可以让一个洞的物理体小得多。这样,当发生接触时,您将确保球可以落入洞中。看一下这张照片(第二个例子):

enter image description here

除此之外,作为一个额外的想法,当检测到接触时,你可以让球稍微移动,然后缩小它以留下掉落的印象。

答案 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,并使用另一个计时器来经常检查球是否落入任何球洞。由于每个球的列表很小,因此性能不是问题。