根据 SKLabel 节点文本的字符数运行 SKAction

Posted

技术标签:

【中文标题】根据 SKLabel 节点文本的字符数运行 SKAction【英文标题】:run an SKAction based on the character count of an SKLabel node's text 【发布时间】:2016-02-18 18:09:57 【问题描述】:

我有一个游戏场景,其中包含与歌曲内容同步发生的动画。我尝试设置的操作之一是与使用 SKLabelNode 显示的歌曲歌词有关。我想要做的是根据 LabelNode 中是否有字符(歌手停止“唱歌”并等待)在两个动画之间切换。我在更新方法中有这个:

var singerActive = false
var lyricsLabel = SKLabelNode()

override func update(currentTime: CFTimeInterval) 
        /* Called before each frame is rendered */
        if lyricsLabel.text?.characters.count == 0
            singerActive = false
        else
            singerActive = true
        

        let sings = SKAction.runBlock  () -> Void in
            self.singer.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
            self.singerIdle.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
        
        let singerInactive = SKAction.runBlock  () -> Void in
            self.singer.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
            self.singerIdle.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
        

        var stopper = true
        if singerActive && stopper
            stopper = false
            singer.runAction(sings)
        

        if singerActive == false && stopper == false

            stopper = true
            singer.runAction(singerInactive)
        

    

不幸的是,这似乎不起作用。活跃歌手状态有效,但当字符数 == 0 时无法触发非活跃状态。我将“stopper”布尔值放在那里,以确保 SKAction 不会像在更新方法中那样被连续调用。我对 Swift 和 SpriteKit 还很陌生,因此我们将不胜感激。

【问题讨论】:

这就是我所看到的。当不活动时,您的第一个条件失败,因此停止器永远不会改变,因此您的第二个条件失败,因为停止器始终为真 【参考方案1】:

你的停止代码正在破坏一切,你想做这样的事情:

    override func update(currentTime: CFTimeInterval) 
    /* Called before each frame is rendered */
    if lyricsLabel.text?.characters.count == 0
        singerActive = false
    else
        singerActive = true
    

    let sings = SKAction.runBlock  () -> Void in
        self.singer.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
        self.singerIdle.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
    
    let singerInactive = SKAction.runBlock  () -> Void in
        self.singer.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
        self.singerIdle.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
    

    if singerActive
        singer.removeAllActions()
        singer.runAction(sings)
    
    else
        singer.removeAllActions()
        singer.runAction(singerInactive)
    


但这也很糟糕,因为这意味着您总是在每次更新时运行一个操作。您可能需要重新编写代码,以免发生这种情况。

所以你需要做这样的事情:

    override func update(currentTime: CFTimeInterval) 
    /* Called before each frame is rendered */
    if lyricsLabel.text?.characters.count == 0
        singerActive = false
    else
        singerActive = true
    

    let sings = SKAction.runBlock  () -> Void in
        self.singer.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
        self.singerIdle.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
    
    let singerInactive = SKAction.runBlock  () -> Void in
        self.singer.runAction(SKAction.fadeAlphaTo(0, duration: 0.1))
        self.singerIdle.runAction(SKAction.fadeAlphaTo(1, duration: 0.1))
    

    if singerActive && singerIdle.alpha = 1
        singer.removeAllActions()
        singerIdle.alpha = 0.99;
        singer.runAction(sings)
    
    else if !singerActive && singer.alpha = 1
        singer.removeAllActions()
        singer.alpha = 0.99;
        singer.runAction(singerInactive)
    


现在我们只在 alpha 状态为 1 时调用它

【讨论】:

太好了,谢谢!这很好用,除了我需要删除 removeAllActions() 方法...每个动画都在持续运行,我只是更改 alpha 状态以使所需的动画可见。 如果你不 removeAllActions 然后他们会建立在你身上,我假设这段代码运行得如此之快,以至于 removeAllActions 在它做任何事情之前就删除了动作 有什么方法可以至少在更新之外进行 skactions 吗?似乎必须有一种更清洁的方式来处理这个...... 不确定你在这里做什么,但有几种方法可以在你的更新之外进行,我只是不打算重写你的代码。您可以在标签文本更改时添加一个监听器,或者您可以创建一个字符串属性并使用 didSet 在新单词出现/消失时运行操作,然后将此字符串属性分配给 text 您介意解释一下添加“侦听器”吗?非常新,非常感谢。

以上是关于根据 SKLabel 节点文本的字符数运行 SKAction的主要内容,如果未能解决你的问题,请参考以下文章

SKA动作起点

汇创新上海积极布局SKA国际大科学工程建设,核心数据管理软件首次完成集成测试

任何 jquery 1.3 兼容插件,使用用户文本输入过滤下拉列表,并根据匹配的输入字符串数进行分组

汇科技“天眼”即将打开,世界上最大射电望远镜首次集成测试

java中如何根据字符串长度来调整文本框大小

notepad++有啥用?