2016-10-16 2 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과 동기화해야한다는 것을 모르기 때문입니다. 해결책은 간단합니다. 적의 스폰 시간을 변경할 때 타이머를 다시 만드십시오.

하지만 ...

당신이해야 NEVER 사용 Timer 당신이 SpriteKit을 사용할 때 물건을 지연 또는 GCD (전 스위프트 3 NSTimer). 자세한 내용은 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

대단히 감사합니다! –