2014-07-26 50 views
1

我想在生成節點之間等待2秒鐘。所以我寫了這樣的代碼:在spriteKit中使用waitForDuration()swift

override func update(currentTime: CFTimeInterval) { 

    let releaseNodes = SKAction.sequence([SKAction.runBlock(self.generateNode),   SKAction.waitForDuration(2)]) 

    self.runAction(releaseNodes) 

} 

但它不起作用。它生成的節點非常瘋狂。 (如20秒)。我該如何處理?任何人都可以幫助我嗎?

編輯:這裏是self.generateNode塊

func generateNode(){ 

    var node: SKSpriteNode = SKSpriteNode(imageNamed: "node") 

    fish.anchorPoint = CGPoint(x:CGFloat(-0.5),y:CGFloat(-0.2))   
    fish.position = CGPoint(x:CGFloat(10),y:CGFloat(30)) 

    var move = SKAction.rotateToAngle(CGFloat(3.14), duration: NSTimeInterval(1)) 
    var remove = SKAction.removeFromParent() 
    var seq = SKAction.sequence([move, remove])  

    node.runAction(seq) 

    self.addChild(node)  

} 
+0

發佈self.generateNode塊碼 – LearnCocos2D

+0

帖子已被編輯 – ahoj

+1

而不是3.14,使用'M_PI'作爲一個常數。 – duci9y

回答

1

蘋果文檔的功能SKScene.Update()

Performs any scene-specific updates that need to occur before scene actions are evaluated.

所以如果更新中()你胡亂正在運行的動作,它會無限循環地創建節點並嘗試運行動作。

你應該選擇一個更好的地方來創建你的場景內容。也許在viewDidLayoutSubviews()之後?或者至少是迴應你場景中的某些動作。

編輯: 它看起來像你想創建內容,讓它移動,然後將其從場景中刪除。你可能會更好地創建幾個精靈,保存對它們的引用,然後讓它們出現,隨時隨地移動並消失。這會更安全。

+0

感謝您的回答。這聽起來很合理。不幸的是,我正在使用swift,spriteKit和XCode大約兩天,我真的不知道該怎麼做。 :( – ahoj

+0

如果你能給我一個更好的想法,你試圖完成我可能會幫助。 – Literphor

0
override func update(currentTime: CFTimeInterval) { 
    static var previousTime = 0.0 
    if (currentTime - previousTime) > 2.0 { 
     let releaseNodes = SKAction.runBlock(self.generateNode) 
     self.runAction(releaseNodes) 
    } 
    previousTime = currentTime 
} 

update(currentTime:)爲您提供當前幀的時間戳。不要忘記使用該屬性。

此外,最後的waitForDuration:操作在原始代碼中不會有明顯的效果。

1

我還是擺脫使用update:方法,千方百計用SKAction S:

- (void)didMoveToView:(SKView *)skView { 
    SKAction *wait = [SKAction waitForDuration:2.]; 
    SKAction *generateNode = [SKAction runBlock:^{ 
     [self generateNode]; 
    }]; 
    [self runAction:[SKAction repeatActionForever: 
     [SKAction sequence:@[wait, generateNode]]]]; 
} 
相關問題