2016-04-14 30 views
1

我想创建一个马里奥风格的旋转平台,保持水平。斯威夫特SpriteKit马里奥风格旋转平台,保持水平

enter image description here

我迄今所做的是创建一个简单的类用于测试目的。

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子类来创建栏和平台,但它们与此问题无关。

如何使平台保持水平。我尝试了下面的工作。

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

platformRound.platform.zRotation = ... 

2)创建一旦平台被添加时设置比使用性能不断更新zRotation一个zRotation属性。

3)试图玩弄physicsJoints

我肯定有,我缺少一个简单的方法。我将不胜感激任何帮助。

+0

你在说这个https://www.youtube.com/watch?v=Igjf-W87bW4还是? – Whirlwind

+0

嘿,谢谢你的回复。那正是我所说的。 – crashoverride777

+0

这应该是*容易*。尽管如此,如果添加创建PlatformRound实例的代码部分以及围绕圆周旋转的代码(如果你这样做的话),这将会很有帮助。或者我可以用'SKSpriteNodes'来给你一个简单的例子,但你可能需要修改它以适应你当前的设置。 – Whirlwind

回答

2

这应该工作:

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具有负值)。就是这样。

这是我所看到的结果:

Rotating Platform

需要的调整,否则该平台将最终达到与其父一同旋转(注意如何白色,中心sprite时随容器节点一起旋转)。