2016-04-14 25 views
1

Yatay duran mario stili bir döner platform oluşturmaya çalışıyorum. Şimdiye kadar ne yaptımSwift SpriteKit Mario yatay dönen yatay platform

enter image description here

test amaçlı Bunun için basit bir sınıf oluşturmaktır.

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") 
    } 
} 

Döndürebileceğim bir roundBase oluşturuyorum. Taban düğümden aşağıya doğru kayan bir çubuk oluşturuyorum. Sonunda her zaman yatay kalması beklenen platformu yaratıyorum. Çubuğu ve platformu oluşturmak için başka bir Platform alt sınıfı kullanıyorum, ancak bu soruyla alakalı değillerdir.

Platformun yatay olarak nasıl kalmasını sağlayabilirim. Çalışmayan aşağıdakileri denedim. Ben sürekli platformu pozisyon veya zRotation

platformRound.platform.zRotation = ... 

2) platformu eklendikten sonra belirlenen ve sürekli zRotation güncellemek için bu özelliği kullanmak daha alır bir zRotation mülkü oluştur güncellemek benim gameScene içinde güncellemede

1) .

3) physicsJoints

ben eksik bir kolay bir yolu yoktur

Im emin uğraşırken çalıştı. Herhangi bir yardım için minnettar olurum.

+0

Bu https://www.youtube.com/watch?v=Igjf-W87bW4 hakkında mı konuşuyorsunuz? – Whirlwind

+0

Hey, cevap için teşekkürler. İşte tam olarak bahsettiğim şey. – crashoverride777

+0

Bu * kolay olmalı *. Yine de, kodun bir kısmını PlatformRound örneğini oluşturduğunuzda ve çevresi etrafında döndürdüğünüz kodu eklediğinizde (eğer bunu böyle yapıyorsanız) yardımcı olacaktır. Ya da size 'SKSpriteNodes' ile basit bir örnek verebilirim, ancak mevcut ayarlarınıza uyacak şekilde değiştirmeniz gerekebilir. – Whirlwind

cevap

2

Bu çalışması gerekir: Ne yaptıysam

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 
      } 
     } 
    } 
} 

, ben konteyner düğüm içine platformu düğümü eklendi ve bu kaba rotasyon uygulanacak olması. Daha sonra, didEvaluateActions içinde platformun rotasyonunu ayarlıyorum (ebeveyninin zRotation'ının negatif bir değerine sahip olmak için). Ve bu kadar. İşte

görüyorum şeyin sonucudur: Aksi platformu sonuna kadar çünkü onun ebeveyni ile birlikte dönen ayarlama, tabi

Rotating Platform

(merkez peri olmayı ne beyaz fark konteyner düğümü ile birlikte döndürülür).