Как заменить узел спрайта новым узлом после того, как он убран с экрана?

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

Ранее я получил некоторую помощь из этого сообщения: Как создать несколько спрайтов (узлов) с одинаковой текстурой, которые будут автоматически генерировать новый при удалении одного узла?

Вот мой код:

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 {

      swipeAndAddPlank(completion: {
        self.addPlank(completion: {
        self.movePlanksUp()
        })

      })
    }
  }


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

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

    let nodeFinishedMoving = SKAction.removeFromParent()

    //let completionAction = SKAction.run({completion!()})

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

    completion?()

  }


    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)

    completion?()

  }


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


}

person SwiftyJD    schedule 12.10.2016    source источник
comment
если вы добавите категорию физики, на которую влияет гравитация, возможно, вы сможете достичь цели   -  person Simone Pistecchia    schedule 12.10.2016
comment
хмм Физика может быть излишней, если не все сделано правильно, столбцы могут не складываться прямо или вызывать нежелательные подпрыгивающие эффекты. Если бы я был вами, при просмотре вашего массива, когда вы попадаете в точку, где у вас больше нет узла, у вас есть логическое значение, которое вы установили в значение true, тогда любая доска после этого вы перемещаетесь вверх, потому что это логическое значение активировано   -  person Knight0fDragon    schedule 12.10.2016