изпълнете SKAction въз основа на броя знаци на текста на SKLabel възел

Имам сцена на игра, която се състои от анимации, които се появяват в синхрон със съдържанието на песен. Едно от действията, които се опитвам да настроя, е във връзка с текста на песента, който се показва с помощта на 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. Сложих булетата "стопер" там, за да гарантирам, че SKAction няма да се извиква непрекъснато, както е в метода за актуализиране. Аз съм сравнително нов в Swift и SpriteKit, така че всяка помощ ще бъде много оценена.


person derekFairholm    schedule 18.02.2016    source източник
comment
ето какво виждам. когато е неактивно, първото ви условие се проваля, така че запушалката никога не се променя, следователно второто ви условие се проваля, защото запушалката винаги е вярна   -  person Knight0fDragon    schedule 19.02.2016


Отговори (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)
    }

}

Сега го извикваме само когато нашите алфа състояния са 1

person Knight0fDragon    schedule 18.02.2016
comment
Страхотно благодаря! Това работи добре, освен че трябваше да изтрия метода removeAllActions()... всяка анимация се изпълнява непрекъснато и аз просто променям алфа състоянията, за да направя желаната анимация видима. - person derekFairholm; 19.02.2016
comment
ако не премахнете AllActions, тогава те ще се натрупат върху вас, предполагам, че този код върви толкова бързо, че removeAllActions премахва действия, преди да направи нещо - person Knight0fDragon; 19.02.2016
comment
Има ли някакъв начин да се направят поне действията извън актуализацията? Изглежда, че трябва да има по-чист начин за справяне с това... - person derekFairholm; 20.02.2016
comment
не съм сигурен какво търсите тук, но има няколко начина, по които можете да го направите извън вашата актуализация, просто нямах да пренаписвам кода ви. Можете да добавите слушател, когато текстът на етикета се промени, или можете да създадете свойство на низ и да използвате didSet за изпълнение на действия, когато се появи/изчезне нова дума, след което да присвоите това свойство на низ на текст - person Knight0fDragon; 20.02.2016
comment
Бихте ли обяснили добавянето на слушател? Доста нов за това, много оценявам. - person derekFairholm; 20.02.2016
comment
raywenderlich.com/90773/ погледнете наблюдението на ключ-стойност - person Knight0fDragon; 20.02.2016