根据 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国际大科学工程建设,核心数据管理软件首次完成集成测试