2016-10-16 13 views
0

私は、scheduledTimerでtimeIntervalを変更しようとしています。変数を間隔に変更し、timeIntervalをこの変数に設定することで、これを実行しようとしています。私はエラーはありませんが、timeIntervalは変更されません。誰か助けてくれますか?timeInterval変数が機能しません

var enemyTimer = Timer() 
var playTime = 0 
var enemySpawnTime: Double = 3 
enemyTimer = Timer.scheduledTimer(timeInterval: Double(enemySpawnTime), target: self, selector: #selector(GameScene.enemySpawn), userInfo: nil, repeats: true) 
playTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.ingameTimer), userInfo: nil, repeats: true) 
    func enemySpawn() { 

    let enemy = SKSpriteNode(imageNamed: "Enemy") 

    let minValue = self.size.width/8 
    let maxValue = self.size.width - 20 

    let spawnPoint = UInt32(maxValue - minValue) 

    enemy.position = CGPoint(x: CGFloat(arc4random_uniform(spawnPoint)), y: self.size.height) 

    let action = SKAction.moveTo(y: -70, duration: 5) 
    enemy.run(action) 

    self.addChild(enemy) 
} 

func ingameTimer() { 

    playTime += 1 

    if(playTime >= 10 && playTime < 30){ 
     enemySpawnTime = 2 
     print(enemySpawnTime) 
    }else 
    if(playTime >= 30 && playTime < 60){ 
     enemySpawnTime = 1 
     print(enemySpawnTime) 
    }else 
    if(playTime >= 60 && playTime < 120){ 
     enemySpawnTime = 0.75 
     print(enemySpawnTime) 
    }else 
    if(playTime >= 120 && playTime < 180){ 
     enemySpawnTime = 0.5 
     print(enemySpawnTime) 
    }else 
    if(playTime >= 180 && playTime < 240){ 
     enemySpawnTime = 0.25 
     print(enemySpawnTime) 
    } 
} 

誰かが私を助けてくれることを願っています! ありがとう!

答えて

1

コードが機能しない理由は、Timerオブジェクトがその間隔がenemySpawnTimeと同期する必要があることを知らないためです。解決策は簡単です。敵の発動時間を変更するときにタイマーを再作成するだけです。

しかし...

あなたはSpriteKitベースを使用しているときのものを遅らせるか、GCD(前スウィフト3からNSTimerNEVER使用Timerがすべき。詳細はthisを参照してください。

これを行う正しい方法は、SKActionのシーケンスを作成することです。 selfSKSceneのサブクラスであると仮定すると、

、あなたがこれを行うことができます:somePlaceholderNodeだけでアクションを実行しますが、何もしないノードである

override func didMove(to view: SKView) { 
    let waitAction = SKAction.wait(forDuration: enemySpawnTime) 
    let enemySpawnAction = SKAction.run { self.enemySpawn() } 
    let sequence = SKAction.sequence([waitAction, enemySpawnAction]) 
    somePlaceholderNode.run(SKAction.repeatForever(sequence)) 
} 

。これについては後で説明します。

これは他のタイマーにも同様に行う必要があります。あなたはタイマー間隔を変更するたび

今、また次の操作を行います。

ここ
somePlaceholderNode.removeAllActions() 
let waitAction = SKAction.wait(forDuration: enemySpawnTime) 
let enemySpawnAction = SKAction.run { self.enemySpawn() } 
let sequence = SKAction.sequence([waitAction, enemySpawnAction]) 
somePlaceholderNode.run(SKAction.repeatForever(sequence)) 

私は、最初のノードが実行されていたアクションを削除し、ほぼ同じアクションを実行するように指示しますが、異なる時間間隔。あなたはenemySpawnTimedidSetブロックにコードブロックを追加することができます。

var enemySpawnTime: Double = 3 { 
    didSet { 
     let waitAction = SKAction.wait(forDuration: enemySpawnTime) 
     let enemySpawnAction = SKAction.run { self.enemySpawn() } 
     let sequence = SKAction.sequence([waitAction, enemySpawnAction]) 
     somePlaceholderNode.run(SKAction.repeatForever(sequence)) 
    } 
} 

今、あなたのコードは動作するはずです!我々はremoveAllActionsを呼び出すことでアクションを削除するとき、我々は実行されているすべてアクションを削除したくないので、我々はここにプレースホルダノードをする理由

理由があります。

+0

ありがとうございました! –

関連する問題