title: Animating individual characters in a SKLabelNode
body: <p>Is there a more efficient way to animate text shivering with typewriting all in one sklabelnode? I'm trying to achieve the effect in some games like undertale where the words appear type writer style while they are shivering at the same time.</p>
  
  <p>So far I've only been able to achieve it but with such luck: </p>
  
  <pre><code>class TextEffectScene: SKScene {
  
      var typeWriterLabel : SKLabelNode?
      var shiveringText_L : SKLabelNode?
      var shiveringText_O : SKLabelNode?
      var shiveringText_S : SKLabelNode?
      var shiveringText_E : SKLabelNode?
      var shiveringText_R : SKLabelNode?
  
      var button : SKSpriteNode?
  
  
      override func sceneDidLoad() {
          button = self.childNode(withName: "//button") as? SKSpriteNode
  
          self.scaleMode = .aspectFill //Very important for ensuring that the screen sizes do not change after transitioning to other scenes
  
          typeWriterLabel = self.childNode(withName: "//typeWriterLabel") as? SKLabelNode
          shiveringText_L = self.childNode(withName: "//L") as? SKLabelNode
          shiveringText_O = self.childNode(withName: "//O") as? SKLabelNode
          shiveringText_S = self.childNode(withName: "//S") as? SKLabelNode
          shiveringText_E = self.childNode(withName: "//E") as? SKLabelNode
          shiveringText_R = self.childNode(withName: "//R") as? SKLabelNode
      }
  
  
  
      // Type writer style animation
  
      override func didMove(to view: SKView) {
          fireTyping()
          shiveringText_L?.run(SKAction.repeatForever(SKAction.init(named: "shivering")!))
          shiveringText_O?.run(SKAction.repeatForever(SKAction.init(named: "shivering2")!))
          shiveringText_S?.run(SKAction.repeatForever(SKAction.init(named: "shivering3")!))
          shiveringText_E?.run(SKAction.repeatForever(SKAction.init(named: "shivering4")!))
          shiveringText_R?.run(SKAction.repeatForever(SKAction.init(named: "shivering5")!))
      }
  
  
      let myText = Array("You just lost the game :)".characters)
      var myCounter = 0
      var timer:Timer?
  
      func fireTyping(){
          typeWriterLabel?.text = ""
          timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(TextEffectScene.typeLetter), userInfo: nil, repeats: true)
      }
  
  
      func typeLetter(){
          if myCounter &lt; myText.count {
              typeWriterLabel?.text = (typeWriterLabel?.text!)! + String(myText[myCounter])
              //let randomInterval = Double((arc4random_uniform(8)+1))/20 Random typing speed
  
              timer?.invalidate()
              timer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(TextEffectScene.typeLetter), userInfo: nil, repeats: false)
          } else {
              timer?.invalidate() // stop the timer
          }
          myCounter += 1
      }
  
  
      override func touchesBegan(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
          let touch = touches.first
  
          if let location = touch?.location(in: self) {
              if (button?.contains(location))! {
                  print("doggoSceneLoaded")
                  let transition = SKTransition.fade(withDuration: 0.5)
                  let newScene = SKScene(fileNamed: "GameScene") as! GameScene
                  self.view?.presentScene(newScene, transition: transition)
              }
  
          }
  
  
      }
  
  
  
  }
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/0kxX5.png" rel="noreferrer"><img src="https://i.stack.imgur.com/0kxX5.png" alt="enter image description here"></a></p>
  
  <p>As you can see, I had to animate each individual label node in a word "loser". </p>
  
  <p>To create this effect: </p>
  
  <p><a href="https://i.stack.imgur.com/3r13E.gif" rel="noreferrer"><img src="https://i.stack.imgur.com/3r13E.gif" alt="enter image description here"></a></p>