2017-11-28 18 views
1

私はSpriteKit経由でゲームを作成します。ゲームでは数秒ごとにボールがスクリーンに(機能を介して)出現し、プレイヤーはそれらを爆破しなければならない。今度は、スコアを使ってプレーヤーのレベルをチェックしたいので、スコアが10より大きい場合、spawnBall関数が2回実行されます(したがって、2つのボールが画面上に生成されます)。私は更新の楽しさで試してみました(それはプレイヤーのスコアを "読み込み"、スコアに依存してspawnBall関数を呼び出すでしょう)。残念なことに私がそれをすると、数秒で数百(またはそれ)のボールが画面に表示されます(数秒ごとに関数を呼び出し、スコアがXの間に呼び出しを増やしたいと言ったので)。私は実際どのようにそれを行うか分からない。ここ は私のコードです:即時呼び出し機能複数回内更新

override func update(_ currentTime: CFTimeInterval) { 

    if (self.score <= 10){ 
     spawnBalls() 
    } 

    if (self.score > 10 && self.score <= 20){ 
     spawnBalls() 
     spawnBalls() 
    } 

    if (self.score > 20){ 
     spawnBalls() 
     spawnBalls() 
     spawnBalls() 
    } 

    if (self.subscore == 3) { 
     _ = randomBallColorToBlow() 
     self.subscore = 0 
    } 
} 

func spawnBalls() { 
    let wait = SKAction.wait(forDuration: 1) 
    let action = SKAction.run { 
     self.createBall() 
    } 
    run(SKAction.repeatForever((SKAction.sequence([wait, action])))) 
} 

は私が更新機能を使用せずに、それをどのように行うことができます?

+0

の「無限」量を加えることなく、レベルアップの「無限」量を扱うことができるように代わりにintのブール値を使用してレベルを追跡することをお勧めしますあなたの質問では、それはコードを不必要に長くし、従うのが難しくなります –

答えて

2

あなたはアップデートファンクションでそれを呼び出すことで、スポーンボールを1秒間に60回呼びます。 更新プログラムでより高いスポーンレートにアップグレードするために特定の要件が満たされているかどうかを確認してみてください。

private var upgradedToLevel2 = false 
private var upgradedToLevel3 = false 

//called somewhere probably in a start game func 
spawnBalls(duration: 1.0) 

override func update(_ currentTime: CFTimeInterval) { 

    if (self.score > 10 && self.score <= 20) && !upgradedToLevel2 { 
     //this prevents the if loop from running more than once 
     upgradedToLevel2 = true 
     self.removeAction(forKey: "spawn") 
     spawnBalls(duration: 0.5) 
    } 

    if (self.score > 20) && !upgradedToLevel3 { 
     //this prevents the if loop from running more than once 
     upgradedToLevel3 = true 
     spawnBalls(duration: 0.33) 
    } 
} 

func spawnBalls(duration: Double) { 

    let wait = SKAction.wait(forDuration: duration) 
    let action = SKAction.run { self.createBall() } 
    let repeater = SKAction.repeatForever(SKAction.sequence([wait, action])) 

    run(repeater, withKey: "spawn") 
} 
+0

ありがとう!その作業は、あなたがなぜアップグレードvarsをプライベートとして設定するのか説明できますか? – omerc

+0

これは技術的にゲームの目的の動作を変更します。あなたはもはや瞬時に2つの産卵をしていません。あなたは2つの小さな期間に産卵しています。ただ心に留めておいてください。 – Knight0fDragon

+0

あなたは絶対に正しいです、私はそれを考慮していませんでした。彼は、プロセスをスピードアップしたり、ボールを塊に表示したいのかどうかを決定するために、それをOPに推測します。 –

1

前述したように、あなたはボールを複数回スポーンしており、それを分解する必要があります。私はあなたが関係のないコードを貼り付けないようにする必要があるブール変数

private var nextLevel = 0 //Level 0 allows us to spawn a ball on startup, so no need to call spawnBalls anywhere else 

override func update(_ currentTime: CFTimeInterval) { 

    if (self.score > 10 * nextLevel){ 
     self.removeAction(forKey: "spawn") //this prevents the if loop from running more than once 
     nextLevel += 1 
     spawnBalls(count:nextLevel,forDuration:1) //You can change the 1 here if you want to spawn balls at a faster speed, I would recommend a variable that uses nextLevel in a forumula 
    } 
} 

func spawnBalls(count:Int, forDuration duration:TimeInterval) { 
    let range = 0..<count 
    let wait = SKAction.wait(forDuration: duration) 
    let action = SKAction.run {range.forEach{self.createBall()}} 
    let repeater = SKAction.repeatForever(SKAction.sequence([wait, action])) 
    removeAction(forKey:"spawn") 
    run(repeater, withKey: "spawn") 
} 
関連する問題