使节点以相同的速度从不同的起点移动到终点



我有一行SKSPriteNode,我希望这些节点从屏幕顶部移动到底部,这些节点不在同一个CGPoint,它们在彼此后面形成一行,当我使用正常的SKAction.MoveToY()并给它持续时间时,它们以不同的速度移动,以便所有节点同时到达,我想要的是让所有节点以相同的速度移动,并一个接一个地到达,保持其线形。

以下是我创建它们的方法:

     for i in 0...5 {
         let enemy = SKSPriteNode(imageNamed: "Enemy")
         enemy.position = CGPoint(x: size.width / 2, y: size.height + enemy.size.height * CGFloat(i))
         addChild(enemy)
         enemy.runAction(SKAction.moveToY(0 - size.height, duration: 5))
        }

因为行动的持续时间参数直接影响节点的移动速度,所以必须正确计算该参数,因为在您的情况下,每个敌人节点应该移动不同的距离。正如我在评论中所说,计算时间(持续时间参数)的公式是:

时间=距离/速度

你可以这样做:

class GameScene: SKScene{
struct Constants {
    static let enemySpeed:CGFloat = 100
}
override func didMoveToView(view: SKView) {

    print("Scene height : (size.height)")
    print("Enemy speed : (Constants.enemySpeed)")

    for i in 1...6 {
        //Creating random colors just for easier debugging.
        let randomColor = UIColor(red   : CGFloat(arc4random()) / CGFloat(UInt32.max),
            green : CGFloat(arc4random()) / CGFloat(UInt32.max),
            blue  : CGFloat(arc4random()) / CGFloat(UInt32.max),
            alpha : 1.0)
        let enemy = SKSpriteNode(color: randomColor, size:CGSize(width: 30, height: 30))
        enemy.zPosition = 10
        // Time = Distance / Speed
        let distance:CGFloat = frame.size.height + CGFloat(i) * enemy.size.height
        print("Enemy (i) will travel (distance) points")
        let duration = NSTimeInterval(distance / Constants.enemySpeed)
        print("Enemy (i) will stop moving after (duration) seconds")
        let enemyX = CGRectGetMidX(frame)
        let enemyY = frame.size.height + enemy.size.height/2 +  CGFloat(i) * enemy.size.height
        enemy.position = CGPoint(x: enemyX, y: enemyY)
        print("Enemy (i) start position is (enemy.position)")
        addChild(enemy)
        let endPosition = -enemy.size.height/2
        let move = SKAction.moveToY(endPosition, duration: duration)
         print("Enemy (i) end position is (-enemy.size.height/2)")
        enemy.runAction(move)
    }
}

}

根据0x141E的建议,我已经更正了距离计算。这是输出:

Scene height : 667.0
Enemy speed : 100.0
Enemy 1 will travel 697.0 points
Enemy 1 will stop moving after 6.97 seconds
Enemy 1 start position is (187.5, 712.0)
Enemy 1 end position is -15.0
Enemy 2 will travel 727.0 points
Enemy 2 will stop moving after 7.27 seconds
Enemy 2 start position is (187.5, 742.0)
Enemy 2 end position is -15.0
Enemy 3 will travel 757.0 points
Enemy 3 will stop moving after 7.57 seconds
Enemy 3 start position is (187.5, 772.0)
Enemy 3 end position is -15.0
Enemy 4 will travel 787.0 points
Enemy 4 will stop moving after 7.87 seconds
Enemy 4 start position is (187.5, 802.0)
Enemy 4 end position is -15.0
Enemy 5 will travel 817.0 points
Enemy 5 will stop moving after 8.17 seconds
Enemy 5 start position is (187.5, 832.0)
Enemy 5 end position is -15.0
Enemy 6 will travel 847.0 points
Enemy 6 will stop moving after 8.47 seconds
Enemy 6 start position is (187.5, 862.0)
Enemy 6 end position is -15.0

尝试使用moveBy:而不是moveTo:,这样可以使所有精灵移动相同的量。

最新更新