移动父母时如何保持儿童SKNode速度?

时间:2016-01-20 04:40:06

标签: ios swift sprite-kit game-physics skphysicsbody

我正在使用SpriteKit在Swift上进行游戏。我有一个带有SKPhysicsBody的父节点和几个带有自己物理主体的子节点。所有子节点都具有相对于父节点的一些速度。在为父节点提供速度时,如何保持相对速度?这是伪代码,用于显示我正在尝试做的事情:

let parent:SKNode = SKNode()
let child:SKNode = SKNode()
parent.physicsBody = SKPhysicsBody()
child.physicsBody = SKPhysicsBody()
parent.addChild(child)

child.physicsBody!.velocity = CGVectorMake(dx: 5, dy: 5)
// child now has velocity
parent.physicsBody!.velocity = CGVectorMake(dx: 10, dy:10)
// parent has velocity, but child velocity is still (5,5)

如何设置子速度以使其保持相对于父级的速度? (例如,一旦父母被给予(10,10)的速度,孩子的绝对速度应变为(15,15),以使其相对于父母保持(5,5)。 我尝试使用SKPhysicsJoint但似乎修复了节点并且不允许速度。有解决方案吗(我确定我忽略了一些明显的东西,但我是SpriteKit的新手) 谢谢!

1 个答案:

答案 0 :(得分:0)

如果您希望孩子的速度相对于其父亲,请将父亲的速度添加到update方法中孩子的恒定速度。例如,

override func update(currentTime: CFTimeInterval) {
    child.physicsBody?.velocity = CGVectorMake(parentNode.physicsBody!.velocity.dx + 5.0, parentNode.physicsBody!.velocity.dy + 5.0)
}
顺便说一句,你不应该在Sprite Kit中使用parent作为变量名,因为它是SKNode的属性。

<强>更新

您可以使用以下内容遍历父节点的所有子节点。

override func update(currentTime: CFTimeInterval) {
    for (i, child) in parentNode.children.enumerate() {
        child.physicsBody?.velocity = CGVectorMake(parentNode.physicsBody!.velocity.dx + velocity[i].dx, parentNode.physicsBody!.velocity.dy + velocity[i].dy)
    }
}

velocityCGVector的数组,其中包含每个孩子的速度。