SpriteKit:暂时改变精灵速度的更好方法?

时间:2015-03-24 21:12:27

标签: ios swift sprite-kit

假设节点A正在以(0,9.8)的原始速度矢量移动。在与节点B发生碰撞后,节点A应暂时向后移动,例如使用向量(0,-2),但在0.2秒后,恢复其原始速度。换句话说,节点A应该在继续其原始轨迹之前模拟来自节点B的碰撞的影响。

这需要在四个方向发生,所以我们不能依靠引力(只能在一个方向上工作)。

我们打算做这样的事情:

func didBeginContact(contact: SKPhysicsContact!) {
        let collision:UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)

        let dx = nodeB?.physicsBody?.velocity.dx
        let dy = nodeB?.physicsBody?.velocity.dy

        nodeB.runAction(                
            SKAction.sequence([
                SKAction.runBlock {
                    nodeB?.physicsBody?.applyImpulse( CGVectorMake(0, -2.0))
                },
                SKAction.waitForDuration(0.2)
            ]),
            completion: {
                nodeB?.physicsBody?.velocity.dx = dx
                nodeB?.physicsBody?.velocity.dy = dy
            }
        )

}

然而,这似乎很混乱。使用Swift有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

当你有复杂的代码时,最好使用中间变量。

let dx = nodeB?.physicsBody?.velocity.dx
let dy = nodeB?.physicsBody?.velocity.dy

let waitAction = SKAction.waitForDuration(0.2)

let runAction = SKAction.runBlock({ () -> Void in
    nodeB?.physicsBody?.applyImpulse( CGVectorMake(0, -2.0))
    return
})

let sequenceAction = SKAction.sequence([runAction,waitAction])

nodeB?.runAction(sequenceAction, completion: { () -> Void in
    nodeB?.physicsBody?.velocity.dx = dx!
    nodeB?.physicsBody?.velocity.dy = dy!
})

答案 1 :(得分:1)

只是一个提示:如果我直接修改了physicsBody.velocity ,我注意到奇怪的物理引擎中断(不是崩溃,但是物理会以某种方式损坏 )。

应该使用更新方法