动画SKLabelNode

时间:2017-05-04 11:06:22

标签: swift3 sprite-kit skspritenode

是否有更有效的方法可以在一个sklabelnode中使用打字动画文字颤抖?我试图在某些游戏中实现这种效果,比如在同时发抖的时候,这些单词会出现类型的作家风格。

到目前为止,我只能实现它,但幸运的是:

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 < 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<UITouch>, 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)
            }

        }


    }



}

enter image description here

正如您所看到的,我必须在单词&#34; loser&#34;中为每个单独的标签节点设置动画。

要创建此效果:

enter image description here

3 个答案:

答案 0 :(得分:2)

对于那些可能对 Swift 4 感兴趣的人,我已经围绕这个名为 SKAdvancedLabelNode 的特殊请求实现了 gitHub 项目。 您可以找到here所有来源。

<强>用法

// horizontal alignment : left
var advLabel = SKAdvancedLabelNode(fontNamed:"Optima-ExtraBlack")
advLabel.name = "advLabel"
advLabel.text = labelTxt
advLabel.fontSize = 20.0
advLabel.fontColor = .green
advLabel.horizontalAlignmentMode = .left
addChild(self.advLabel)
advLabel.position = CGPoint(x:frame.width / 2.5, y:frame.height*0.70)
advLabel.sequentiallyBouncingZoom(delay: 0.3,infinite: true)

<强>输出

enter image description here

答案 1 :(得分:1)

我有很多经验...在你已经做的事情之外没有办法做到这一点。我的解决方案(用于文本游戏)是使用NSAttributedString和CoreAnimation,它允许你在UILabels上拥有疯狂的好动画......然后在SpriteKit的顶部添加UILabels。

我正在研究一个更好的SKLabel子类,但在我意识到如果没有更多的工作就没有办法让这个字距变得正确的时候最终放弃了它。

可以使用SKSpriteNode并将视图作为纹理,然后您只需每帧更新纹理,但这需要更多的时间/资源。

最好的方法是在SK编辑器中如何做到这一点。如果您需要 lot 的动画文本,那么您需要使用UIKit和NSAttributedString以及CoreAnimation来进行奇特的事情。

这是一个巨大的,大规模的监督IMO,是SpriteKit的一个相当大的缺点。 SKLabelNode SUCKS。

答案 2 :(得分:1)

正如我在评论中所说,您可以从SKNode中继承子类并使用它为每个字符生成标签。然后,将标签存储在一个数组中以供将来参考。

我很快就把东西扔到了一起,效果很好。我不得不在位置上玩一点,所以它看起来不错,因为空间有点小。每个标签的横向对齐也必须是.left,否则,它将全部弯曲。

无论如何,它非常容易使用!试一试!

这是我刚创建的要点的链接。

https://gist.github.com/sonoblaise/e3e1c04b57940a37bb9e6d9929ccce27