Swift 保持水平的 SpriteKit 马里奥风格旋转平台

Swift SpriteKit Mario style rotating platform that stays horizontal

我正在尝试创建一个保持水平的马里奥风格旋转平台。

到目前为止我所做的是创建一个简单的 class 用于测试目的。

  class PlatformRound: SKNode {

    let platform: Platform

// MARK: - Init
init(barSize: CGSize, color: SKColor, pos: CGPoint) {

    /// Base
    let base = SKShapeNode(circleOfRadius: 6)
    //base.name = Platform.Name.normal
    base.fillColor = SKColor.darkGrayColor()
    base.strokeColor = base.fillColor
    base.position = pos
    let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
    base.runAction(SKAction.repeatActionForever(rotatingAction))

    /// Bar
    let bar = Platform(size: barSize, color: color, pos: CGPointMake(0, 0 - (barSize.height / 2)), ofType: .Normal) 
    bar.zPosition = -200

    /// Platform that supposed to stay horizontal
    let platformSize = CGSizeMake(40, GameplayConfig.World.platformHeight)
    let platformPos = CGPointMake(0, 0 - (bar.size.height / 2))
    platform = Platform(size: platformSize, color: color, pos: platformPos, ofType: .Normal)

    super.init()

    addChild(base)
    base.addChild(bar)
    bar.addChild(platform)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
   }
}

我正在创建一个可以旋转的 roundBase。然后,我创建了一个从底部向下的栏,将其添加到基础节点。最后,我创建了应该始终保持水平的平台。 我正在使用另一个 Platform subclass 来创建栏和平台,但它们与这个问题无关。

如何让平台保持水平。我尝试了以下方法,但没有用。

1) 在我的 gameScene 更新中,我不断更新平台位置或 zRotation

 platformRound.platform.zRotation = ...

2) 创建一个 zRotation 属性,在添加平台后设置它,然后使用它 属性 不断更新 zRotation。

3) 尝试使用 physicsJoints

我确定我缺少一种简单的方法。如果有任何帮助,我将不胜感激。

这应该有效:

class GameScene: SKScene{

    override func didMoveToView(view: SKView) {

        backgroundColor = .blackColor()

        let centerSprite = SKSpriteNode(color: .whiteColor(), size: CGSize(width: 10, height: 10))

        centerSprite.zPosition = 3

        let platform = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 70, height: 20))
        platform.zPosition = 2
        platform.name = "platform"

        let container = SKNode()
        container.position = CGPoint(x: frame.midX, y: frame.midY)

        container.addChild(centerSprite) //Just for debugging
        container.addChild(platform)
        let radius = 120

        let chain = SKSpriteNode(color: .grayColor(), size: CGSize(width: 3, height: radius))
        chain.position = CGPoint(x: 0, y: radius/2)
        container.addChild(chain)


        platform.position = CGPoint(x: 0, y: radius)

        let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
        container.runAction(SKAction.repeatActionForever(rotatingAction), withKey: "rotating")

        addChild(container)

    }

    override func didEvaluateActions() {

        self.enumerateChildNodesWithName("//platform") { node,stop in

            if let parent = node.parent{
                node.zRotation = -parent.zRotation
            }
        }
    }
}

我所做的是,我已将平台节点添加到容器节点中并将旋转应用于该容器。后来,在 didEvaluateActions 中,我调整了平台的旋转(使其父级的 zRotation 具有负值)。就是这样。

这是我看到的结果:

需要进行调整,否则平台最终将与其父级一起旋转(注意白色的中心精灵如何与容器节点一起旋转)。