2017-06-27 15 views
0

このプログラムでは、タイマーに基づいて1秒に1回ティックダウンする変数があります。ビューの更新機能は、Timerがティックするたびに、またはユーザーがキーを押してアプリケーション内でアクションを起こすたびに実行されます。 printステートメントを通して、変数が実際には毎秒1回変化していることがわかりますが、ユーザーがキーを押したときに画面上で更新がSKLabelNodeにしか伝播しません。物理的なイベントが発生していないときに画面に更新をプッシュするために呼び出される必要がある特別な「フラッシュ」機能はありますか?私は、コンパイラは今、おそらくいくつかの機能が少し異なっていませんでしたSpriteKitビューはタイマーイベントに応答して更新されません

func startGame() { 
     ... 
     let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: true) 
} 

func timerUpdate(){ 
     print("Before:\(mouseLife)") 
     mouseLife -= 1 
     displayNumbers2() 
     print(mouseLife) 
} 

func displayNumbers2() { 
     ... 
     mouseLifeLabel.text = String(mouseLife) 
     ... 
} 
+2

第1、あなたはSKSceneでタイマーを使用する必要はありません。いいえ、あなたのコードは何ですか? –

+0

@ElTomatoなぜ私はSKSceneでタイマーを使いたいのですか?設定した間隔で繰り返し更新される値を表示するにはどうすればよいですか?コードを質問に編集します。 – RedEagle2000

+0

完成したアニメーションに基づいてゲームシーンを更新する場合は、フレームのレンダリングに要する時間の差がある可能性があるため、Timerを使用しない方がよいでしょう。しかし、タイマーを使って(この場合は)1秒の間隔が経過したことをあなたのシーンに知らせるために、このようなことは全く問題ありません。私は、ユーザーがレベルを完了するために2分と言うと、それは完全に正常に動作するタイマを使用しています。同様のアプローチを使用して、「フラッシング」なしで残り時間を表示します。 mouseLifeが印刷されたときにラベルを表示することはできますか? – JohnV

答えて

1

は...

var mouseLifeLabel: Int = 5 { 
    didSet { 
     mouseLifeLabel.text = String(mouseLife) 
     if mouseLifeLabel <= 0 { 
       //Gameover func 
     } 
    } 
} 

func startGame() { 
     ... 
     let action = SKAction.block({[unowned self] in 
      self.mouseLife -= 1 
     }) 
     let wait = SKAction.wait(1) 
     let seq = SKAction.sequance([action, wait]) 
     let forever = SKAction.repeatForever(seq) 
     run(forever) 
} 
+0

あなたはあなたの待ち時間を忘れてしまいました。このコードはゲームをロックします – Knight0fDragon

+0

@ Knight0fDragon確かに!ありがとう私は更新されます –

関連する問題