假设节点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有更好的方法吗?
答案 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 ,我注意到奇怪的物理引擎中断(不是崩溃,但是物理会以某种方式损坏 )。
应该使用更新方法。