2017-05-20 7 views
0

xcodeでゲームを作成しています。勝者は負のスコアまたは0になります。すべてうまくいったが、今では負のポイントを相手に追加したい。私はこのコードを使用しました:iMac while whileループがフリーズする

while (activePlayer.score < 0) { 
       DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
        self.activePlayer.score += 1 
        self.activePlayer.scoreLabel.text = String (self.activePlayer.score) 
        self.notActivePlayer.score += 1 
        self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score) 
       } 
      } 

私は今この部分に来るとき、それはフリーズします。最悪のことは、私のiMac全体がフリーズすることです。非常に遅くなってきているので、シミュレータを閉じてスピードを戻すのに10分ほど待たなければなりません。

私の単純な結論は、このコードは間違っています。しかし、なぜ? 私は選手にスコアの変更を見せたいので、スコアに追加されたすべてのポイントの後にラベルテキストが更新されるのです。

答えて

0

あなたのwhileループは非常に悪い考えです。あなたは何をするでしょうを期待していますか?最初の反復では、asnycタスクをスケジュールし、繰り返しが完了し、次のタスクがスケジュールされます。
ループが実行されている最初の分割秒に数千の非同期タスクがスケジュールされます。

変更をアニメーション化する場合は、最初の終了後に次のタスクをスケジューリングする必要があります。次はそれを行うための一般的な方法ですが、私は遊び場でそれを実行していない:

func schedule() { 
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     self.activePlayer.score += 1 
     self.activePlayer.scoreLabel.text = String (self.activePlayer.score) 
     self.notActivePlayer.score += 1 
     self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score) 
     if (activePlayer.score < 0) { 
      self.schedule() 
     } 
    } 
} 

旋風を正しく使用すると、現在のゲームループから抜け出すになりスプライトキットにdispatchを使用して指摘したように。 SKActionsを介して同じことをして、完了した後に新しいアクションを繰り返し作成することができます。

+2

SpriteKitのdispatch_xyzメソッドを使用することは、ゲームループとペアになっておらず、実行するポイントがわからないため、まだ時間関連のタスクにはあまり適していません。 SKActionsは行く1つの方法です。 – Whirlwind

+0

@Whirlwindあなたは間違いなしです。私はスプライトキットがここで使用されていたことさえ気付かなかった。私はそれを明確にするために何かを追加しようとします。 – luk2302

+0

@ luk2302ご協力いただきありがとうございます。私が期待していたのは、スコアが負の数である限り、1ポイントを加えて新しいスコアを表示し、(プレーヤーが変更を見ることができるように)しばらく待ってから、必要に応じて別のポイントを追加します。 私はあなたのコードを試しましたが、add 1 procesを一度だけ実行しました。 SKAction.waitの処理についても見ていきます。私はそれを試したが、目に見える待っている。私はドローイングボードに戻らなければならないでしょう。 – Delah

関連する問題