#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{завершение!()})