2016-09-21 12 views
0

私は、columnTimeの間待ちアクションを実行してからコードブロックを実行するコードを持っています。これは私が次のことをしたいwaitアクションを無期限に実行する関数

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 

ブロックを一度実行し、その後、時間を待って、その後、ブロック、その後、時間を待って、などになります。run、5秒、4.95秒に列の時間を短縮する実行ブロックコードを待ちます4.90秒待ってから4.90秒に実行時間を短縮するブロックコードを実行する、4.90秒間実行待ちなど

私は以下を試しましたが、何度も何度も何度も何度も何度も実行しています。私の出力は、待機ブロックとブロックコードブロックの両方からのprintステートメントであふれます。

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 
} 

答えて

1

あなたが変数をどのように働かせるかわからないのは、シーケンスを待ちます。シーケンスは常に作成時に割り当てられたものになります。新しいインスタンスを作成しても、古いインスタンスがまだシーケンス内にあるため、この問題は解決されません。繰り返し操作の代わりに、シーケンスを実行するたびに新しいアクションセットを生成する必要があります。

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

これはアクションを1回だけ実行しませんか? – lelephant

+0

いいえあなたは新しいシーケンスを開始するためにシーケンスの最後にstartSpawning()を呼び出しています – Knight0fDragon

+0

信じられないほどです!それは私が言わなければならないことですが、コメントの長さがありますので、この文も書きました – lelephant

関連する問題