2017年12月23日土曜日

フェードアウトしたノードを再度表示する場合の注意事項

概要

SKAction.faceOut はノードをフェードアウトさせるためのアクションです
このアクションを使ってノードを非表示にした場合、そのノードを再度表示させる場合には必ず SKAction.fadeIn を使用しなければなりません
サンプルコードも交えて紹介します

環境

  • macOS X 10.13.2
  • Xcode 9.2 (9C40b)

コード

まず 1 度フェードアウトしたノードを再度表示しようとしても表示されない場合のコードです
なお、ノード (levelup) はデフォルトでは非表示の状態になっています

let show = SKAction.run({
    self.levelup.isHidden = false
})
let wait = SKAction.wait(forDuration: 1.0)
let fadeout = SKAction.fadeOut(withDuration: 0.5)
let hide = SKAction.run({
    self.levelup.isHidden = true
})
let actions = SKAction.sequence([show, wait, fadeout, hide])
levelup.run(actions)

これで表示してから再度非表示にするのに SKAction.faceOut を使っています
非表示は問題なくされるのですが、この流れが再度呼ばれたときに表示されません
なので以下のように変更する必要があります

let fadein = SKAction.fadeIn(withDuration: 0.1)
let show = SKAction.run({
    self.levelup.isHidden = false
})
let wait = SKAction.wait(forDuration: 1.0)
let fadeout = SKAction.fadeOut(withDuration: 0.5)
let hide = SKAction.run({
    self.levelup.isHidden = true
})
let actions = SKAction.sequence([fadein, show, wait, fadeout, hide])
levelup.run(actions)

すごい短い時間のフェードインを入れてあげます
こうすることで levelup ノードは再度表示されます
今回の場合非表示にするときにフェードアウトだけではなく isHidden = true でも非表示設定をしているため SKAction.faceIn の処理が実行されてても実はまで levelup ノードは非表示の状態なのでフェードインのアクションは目視で確認することができません
なので今回の SKAction.faceIn は levelup ノードを表示するためだけの処理になります

最後に

SKAction.faceOut でフェードアウトしたノードを再度表示する方法を紹介しました
フェードアウト後は単純に表示させるでだめの命令ではうまく表示されないようなので注意してください
また今回は同じノードを表示/非表示で使い続けることが前提になります
再表示するときには全く新しい SKSpriteNode などを作成するのであれば特にフェードインを気にする必要はありません

0 件のコメント:

コメントを投稿