2017-12-21 19 views
1

シーンが開始されたときにアニメーションを読み込んで実行していますが、アニメーションを停止するポイントがあります。私は18歳未満です。私はそれがうまくいかない理由を理解していますが、私はそれを解決する方法を見つけることができません。私はfuncの更新をオーバーライドしようとしましたが、私の関数を更新する正しい方法があれば、それを見つけることができません。コメントされた部分の作成方法に関するアイデアはありますか?私はどこに置くべきですか?変数が変更されたときにDidMoveで呼び出されたSKActionを停止する方法

override func didMove(to view: SKView) { 
    loadAnimation(atlasName: "test") 
    runAnimation(spriteName: "testImg", timeFrame: 0.08)  
} 

func loadAnimation(atlasName : String) { 
    let spriteAtlas = SKTextureAtlas(named: "\(atlasName)") 

    for index in 1...spriteAtlas.textureNames.count{ 
     let image = String(format: "\(atlasName)%01d", index) 
     atlasAnimation += [spriteAtlas.textureNamed(image)] 
    } 

} 

func runAnimation(spriteName : String, timeFrame : Double) { 
    let spriteNode = self.childNode(withName: "\(spriteName)") 
    spriteNode?.name = "\(spriteName)" 
    if (spriteNode != nil) { 
     let animation = SKAction.animate(with: atlasAnimation, timePerFrame: timeFrame) 
     let forever = SKAction.repeatForever(animation) 
     spriteNode?.run(forever, withKey: "key") 
     if spriteNode?.name == "whatever" { 
    //THIS PART WON´T WORK BECAUSE WHEN THE SCENE IS LOADED, i = 100 
      if i < 18 { 
       print("if statement!!!") 
       spriteNode?.removeAction(forKey: "key") 
      } 
     } 
    } 

私はFUNC更新を無効にした場合、その後、私のアニメーションが開始したことがないが、IF文が作業を行います。あなたは "if statement !!!"を見ることができます。コンソールで。しかし...何も初めからアニメ化されませんでした、削除するアクションはありませんので、

override func update(_ currentTime: TimeInterval) { 
    runAnimation(spriteName: "testImg", timeFrame: 0.08) 
} 

答えて

2

あなたは、タスクのこの種のプロパティオブザーバを使用することができます。

var i = 50{ 
    didSet{ 
     if i < 18{ 
      spriteNode.removeAction(forKey: "key") 
     } 
    } 
}  

これは毎回iであることを意味します別の値に設定すると、didSetブロックが呼び出されます。

+0

あなたの答えをありがとう、マルセル。私は疑問に思った。私の "spriteNode"は関数 "runAnimation"内に作成されるので( "spriteName"を取得するためにそこに作成する必要があります)、クラスの未解決の識別子とみなされます。 – pantaleonPantoja

+0

また、関数内で試しても機能しませんでした。それをどこに置くべきかは確かではありませんでしたが、私はそれを機能させることができませんでした。 – pantaleonPantoja

+0

spriteNodeを関数内で宣言する必要があるのはなぜですか? var spriteNode:SKSpriteNode?を宣言するだけです。クラスで使用し、関数内でspriteNode = self.childNode(withName: "\(spriteName)") – Marcel

関連する問題