2016-10-11 6 views
0

В настоящее время у меня есть некоторые блоки завершения, которые должны быть выполнены после того, как жестом салфетки завершен. Я поставил точки останова внутри функций, которые должны быть вызваны в блоке завершения, но они никогда не запускаются. Жест жестов работает, я не уверен, почему блокировки завершения не вызываются. Вот мой код:Завершенные блоки в SpriteKit никогда не назывались

import SpriteKit 


let plankName = "woodPlank" 

class PlankScene: SKScene { 

    var plankWood : SKSpriteNode? 

    var plankArray : [SKSpriteNode] = [] 





    override func didMove(to view: SKView) { 

    enumerateChildNodes(withName: plankName) { 
     node, stop in 
     self.plankWood = node as? SKSpriteNode 

     let swipeRight : UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(PlankScene.swipedRight)) 

     swipeRight.direction = .right 

     view.addGestureRecognizer(swipeRight) 


    } 

    } 



    func swipedRight(sender: UISwipeGestureRecognizer) { 

    if sender.direction == .right { 

     //The functions in this completion block are never called 
     swipeAndAddPlank(completion: { 
     self.addPlank(completion: { 
     self.movePlanksUp() 
     }) 

     }) 
    } 
    } 


    func swipeAndAddPlank(completion: (()->Void)?) { 

    let moveOffScreenRight = SKAction.moveTo(x: 400, duration: 0.5) 

    let nodeFinishedMoving = SKAction.removeFromParent() 

    plankWood?.run(SKAction.sequence([moveOffScreenRight,nodeFinishedMoving])) 


    } 


    //This function never called 
    func addPlank(completion: (()->Void)?) { 
    let newPlank = plankWood?.copy() as! SKSpriteNode 
    newPlank.position = CGPoint(x: 0, y: -259) 
    plankArray.append(newPlank) 
    print(plankArray.count) 
    addChild(newPlank) 


    } 

    //This function never called 
    func movePlanksUp() { 
    for node:SKSpriteNode in plankArray { 
     node.run(SKAction.move(by: CGVector(dx: 0, dy: 50), duration: 0.10)) 
    } 
    } 


} 

ответ

0

swipeAndAddPlank не содержит призыв к completion блока, переданного ей. То же самое для addPlank. Вам необходимо вставить звонок в completion().

Возможно, вы ищете SKAction.runBlock. Что-то вроде

let completionAction = SKAction.runBlock({ completion() }) 

Затем добавить completionAction последовательности действий plankWood устанавливается для запуска.

+0

Вот что я ищу! Но по какой-то странной причине я получаю сообщение об ошибке «Невозможно преобразовать значение типа«() »в ожидаемый тип аргумента«() -> Void »« – SwiftyJD

+0

Это то, что я использовал: let completeAction = SKAction.runBlock (addPlank {completion! ()}) – SwiftyJD