удалить узел из массива spritekit swift

Я работаю над небольшой игрой для iOS (spritekit/swift).

У меня есть массив SKSpriteNode в моей сцене, определенный следующим образом:

var spritesTree = [SKSpriteNode]()

затем я заполняю массив функцией и добавляю их в сцену следующим образом:

spritesTree = spritesCollectionTree(count: numTrees)
    for sprite in spritesTree {
        addChild(sprite)
    }

После этого, в зависимости от ситуации, процесс добавляет в массив еще несколько деревьев. Я знаю, как удалить элементы из сцены и массива, если я знаю индекс

            spritesTree[i].removeFromParent()
            spritesTree.removeAtIndex(i)

но моя проблема состоит в том, чтобы удалить конкретный узел в этом массиве, когда я не знаю индекс. Например, когда один из спрайтов был затронут

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    /* Called when a touch begins */

    for touch in (touches as! Set<UITouch>) {

        let location = touch.locationInNode(self)
        let positionInScene = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(positionInScene)

В этом случае ¿Как я могу удалить touchedNode из моего массива spritesTree SKSpriteNode, если я не знаю индекс? Я читал что-то о indexOf, чтобы найти индекс ранее, но это не работает с моим массивом SKSpriteNode. Не могли бы вы мне помочь, пожалуйста?

Бестс,


person Xavi    schedule 20.09.2016    source источник


Ответы (1)


Вы можете создать имя для каждого SKSpriteNode:

spritesTree[index].name = String(index) 

После того, как вы проверите узел, вы конвертируете имя в Int

    let location = touch.locationInNode(self)
    let positionInScene = touch.locationInNode(self)
    let touchedNode = self.nodeAtPoint(positionInScene)
    var index = Int(touchedNode.name)
    touchedNode.removeFromParent()
    spritesTree.removeAtIndex(index)
person gabrielpf    schedule 20.09.2016
comment
Спасибо за ответ, но он не решил мою проблему полностью. Представьте, что у меня есть следующие имена узлов списка [0,1,2,3,4], которые соответствуют позициям. Когда я удаляю первый элемент с именем '2', все в порядке, но если затем я пытаюсь удалить removeAtIndex с именем '4', это не удается, потому что элементы были реорганизованы с позициями 0-›0, 1-› 1, 2->3, 3->4 и теперь в массиве нет 4 позиции. Знаете ли вы, есть ли какая-либо функция, которая возвращает позицию элемента по имени? - person Xavi; 22.09.2016
comment
переименовать все после удаления в цикле. Или вы можете попытаться найти узел в массиве следующим образом: for index in 0...spritesTree.count { if touchedNode == spritesTree[index] { spritesTree.removeAtIndex(index) } } - person gabrielpf; 23.09.2016