блоки завершения в SpriteKit никогда не вызывались

#ios #iphone #swift #sprite-kit #skscene

#iOS #iPhone #swift #sprite-kit #skscene

Вопрос:

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

     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))
    }
  }


}
  

Ответ №1:

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

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

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

Затем добавьте completionAction к последовательности действий, для выполнения которых настроен Планквуд.

Комментарии:

1. Это то, что я ищу! Но по какой-то странной причине я получаю сообщение об ошибке «Не удается преобразовать значение типа ‘()’ в ожидаемый тип аргумента'() -> Void'»

2. Это то, что я использовал: пусть completionAction = SKAction.runBlock(addPlank{завершение!()})