如何以速度移动平台

时间:2015-07-23 14:50:08

标签: swift sprite-kit

我需要移动一个节点而不是SKAction来使用速度 因为在这个问题中Moving Node on top of a moving platform

我希望节点随平台移动,但由于平台没有速度,我无法使用Epic Byte建议

这就是我移动节点的方式

// Move node vertically
let up = SKAction.moveByX(0, y: 200, duration: moveDuration);
let down = SKAction.moveByX(0, y: -200, duration: moveDuration);

node.runAction(SKAction.repeatActionForever(SKAction.sequence([up, down])));

// Move node horizontally
let right = SKAction.moveByX(400, y: 0, duration: moveDuration);
let left = SKAction.moveByX(-400, y: 0, duration: moveDuration);

node.runAction(SKAction.repeatActionForever(SKAction.sequence([right, left])));

1 个答案:

答案 0 :(得分:3)

您应该编辑这个以使其更清晰。看起来您希望使用物理引擎来实现移动平台效果,而不是使用SKActions,因为您需要您的平台是动态的并与物理引擎交互(如this示例中所示)。

所以你有两个选择。第一种方法是将节点移动到某个点,并继续检查节点是否到达该点。如果是,则将节点移回其起始点。要使用实时动作将节点移动到特定点,您可以看到我的答案here。如果您的平台仅在一个方向(水平或垂直)移动,那么您应该只在该方向上应用速度。

我在移动平台时经常使用的另一种方法是向心运动。这将允许您以圆形移动平台。更酷的是,如果将向心运动限制在一个方向(水平或垂直),那么您可以轻松移动平台并获得完美的轻松和缓和效果。您可以在我的回答here中看到如何模拟实时向心运动的示例。

下面是通过利用上面描述的向心运动效果水平移动平台的代码。这有什么好处,它允许您设置半径以及平台运动的周期。但是如果你需要你的平台旅行一些任意路径的点,这将无法工作,所以你需要使用我提到的第一个选项。

class GameScene: SKScene {
    var platform: SKSpriteNode!
    var platformAngularDistance: CGFloat = 0

    override func didMoveToView(view: SKView) {
        physicsWorld.gravity = CGVector(dx: 0, dy: 0)
        platform = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 80, height: 20))
        platform.position = CGPoint(x: self.size.width/2.0+50, y: self.size.height/2.0)
        platform.physicsBody = SKPhysicsBody(rectangleOfSize: platform.size)
        self.addChild(platform)
    }
    override func update(currentTime: NSTimeInterval) {
        let dt: CGFloat = 1.0/60.0 //Delta Time
        let period: CGFloat = 3 //Number of seconds it takes to complete 1 orbit.
        let orbitPosition = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) //Point to orbit.
        let orbitRadius: CGFloat = 50 /*CGPoint(x: 50, y: 50)*/ //Radius of orbit.
        let normal = CGVector(dx:orbitPosition.x + CGFloat(cos(self.platformAngularDistance)) * orbitRadius, dy:0 /*orbitPosition.y + CGFloat(sin(self.node2AngularDistance))*orbitRadius.y*/)
        self.platformAngularDistance += (CGFloat(M_PI)*2.0)/period*dt;
        if (self.platformAngularDistance>CGFloat(M_PI)*2)
        {
            self.platformAngularDistance = 0
        }
        if (self.platformAngularDistance < 0) {
            self.platformAngularDistance = CGFloat(M_PI)*2
        }
        platform.physicsBody!.velocity = CGVector(dx:(normal.dx-platform.position.x)/dt ,dy:0/*(normal.dy-platform.position.y)/dt*/);
    }

}