Как заставить 'removeFromParent ()' работать несколько раз? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть несколько узлов Sprite, загруженных в мою GameScene в случайных местах, но на самом деле это один и тот же узел Sprite, добавленный несколько раз. У меня есть функция в touchesEnded, которая удаляет SpriteNode, как только касание отпускается в том же месте, что и SpriteNode. Это работает только для начального SpriteNode (первый SpriteNode, который был добавлен), но не работает для всех остальных SpriteNode.

Я пытался превратить код «if object.contains (location)» в цикл while, чтобы он повторялся при каждом касании. Это тоже не сработало.

var object = SKSpriteNode()
var objectCount = 0


func spawnObject() {

        object = SKSpriteNode(imageNamed: "image")
        object.position = CGPoint(x: randomX, y: randomY)
        objectCount = objectCount + 1
        self.addChild(object)

}


while objectCount < 10 {

        spawnObject()

}


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        for t in touches {

            let location = t.location(in: self)

            if object.contains(location) {
                object.removeFromParent()
            }

        }

    }

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

1 Ответ

1 голос
/ 01 июля 2019

Хорошо, это основы использования массива для отслеживания порожденных объектов, чтобы вы могли проверить их все:

var objectList: [SKSpriteNode] = [] // Create an empty array


func spawnObject() {

    let object = SKSpriteNode(imageNamed: "image")
    object.position = CGPoint(x: randomX, y: randomY)
    self.addChild(object)

    objectList.append(object) // Add this object to our object array

}

while objectList.count < 10 {

spawnObject()

}


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    for t in touches {

        let location = t.location(in: self)

        // Check all objects in the array
        for object in objectList {
            if object.contains(location) {
                object.removeFromParent()
            }
        }
        // Now remove those items from our array
        objectList.removeAll { (object) -> Bool in
            object.contains(location)
        }
    }

}

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

...