2016-09-21 2 views
0

J'ai un code qui exécute une action d'attente pendant une durée de columnTime, puis exécute un bloc de code. Il en résulte dans le bloc en cours d'exécution une fois, puis le temps d'attente, puis bloquer, puis le temps d'attente, etc.Fonction permettant d'exécuter une action d'attente à des intervalles décroissants indéfiniment

func startSpawning(){ 
    print(columnTime) 
    let wait = SKAction.waitForDuration(columnTime) 
    let block = SKAction.runBlock({[unowned self] in self.spawnObstacle()}) 
    let sequence = SKAction.sequence([wait, block]) 
    runAction(SKAction.repeatActionForever(sequence), withKey: "spawning") 
} //startSpawning 

Je veux les éléments suivants: attendez 5 secondes, le code de bloc exécuter ce qui diminue le temps de la colonne à 4,95 secondes, exécutez attendez 4,95 secondes, exécutez le code de bloc qui réduit le temps d'attente à 4,90 secondes, attendez 4,90 secondes, etc.

J'ai essayé ce qui suit mais il exécute chaque action encore et encore et il n'y a pas d'attente. Ma sortie inonde les instructions d'impression des blocs de code d'attente et de blocage.

func startSpawning(){ 
    let wait = SKAction.runBlock({[unowned self] in self.waitFunc()}) 
    let block = SKAction.runBlock({[unowned self] in self.spawnObstacle()}) 
    let sequence = SKAction.sequence([wait, block]) 
    runAction(SKAction.repeatActionForever(sequence), withKey: "spawning") 
} //startSpawning 
func waitFunc() -> SKAction{ 
    print("running wait func") 
    return SKAction.waitForDuration(getColumnTime()) 
} 
func getColumnTime() -> NSTimeInterval { 
    return columnTime 
} 

Répondre

1

Vous ne comprenez pas comment les variables fonctionnent, une fois que vous affectez l'attente à la séquence, c'est tout. La séquence sera toujours ce qui a été assigné au moment de la création. Créer une nouvelle instance ne résoudra pas ce problème, car l'ancien est toujours dans la séquence. Au lieu d'une action de répétition, vous devez générer un nouvel ensemble d'actions chaque fois que vous exécutez la séquence:

var columnTime : NSTimeInterval = 10 

func startSpawning(){ 
    let wait = SKAction.waitForDuration(columnTime) 
    let block = SKAction.runBlock() 
       { 
        [unowned self] in 
        columnTime -= 0.1 
        self.spawnObstacle() 
        self.startSpawning() 
       } 
    let sequence = SKAction.sequence([wait, block]) 
    removeActionForKey("spawning") 
    runAction(sequence, withKey: "spawning") 
} 
+0

L'action ne serait-elle pas lancée une seule fois? – lelephant

+0

non vous appelez startSpawning() à la fin de la séquence pour démarrer une nouvelle séquence – Knight0fDragon

+0

incroyable! c'est tout ce que j'ai à dire, mais il y a une longueur de caractère commentaire, donc j'ai écrit cette phrase aussi – lelephant