"Попытка добавить SKNode, у которого уже есть родитель" в Swift

У меня есть эта функция, которую я использую для создания объектов Flower в случайных местах каждую секунду:

func spawnFlower() {
    //Create flower with random position
    let tempFlower = Flower()
    let height = UInt32(self.size.height / 2)
    let width = UInt32(self.size.width / 2)
    let randomPosition = CGPoint(x: Int(arc4random_uniform(width)), y: Int(arc4random_uniform(height)))
    tempFlower.position = randomPosition

    var tooClose = false
    flowerArray.append(tempFlower)

    // enumerate flowerArray
    for flower in flowerArray {

        // get the difference in position between the current node
        // and each node in the array
        let xPos = abs(flower.position.x - tempFlower.position.x)
        let yPos = abs(flower.position.y - tempFlower.position.y)

        // check if the spawn position is less than 10 for the x or y in relation
        // to the current node in the array
        if (xPos < 10) || (yPos < 10) {
            tooClose = true
        }

        if tooClose == false {
            //Spawn node
            addChild(tempFlower)
        }
    }
}

Я создаю новый экземпляр для flower при каждом вызове функции, но по какой-то причине, когда я вызываю функцию, как показано ниже, она выдает мне ошибку:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent:

Функция spawnFlower() вызывается каждую секунду. Он работает при первом вызове, а во второй раз вылетает. Что я делаю неправильно?

1 ответ

Решение

Вызов addChild() должен выйти за пределы цикла for, чтобы tempFlower добавляется к своему родителю только один раз.

func spawnFlower() {
    //Create flower with random position
    let tempFlower = Flower()
    let height = UInt32(self.size.height / 2)
    let width = UInt32(self.size.width / 2)
    let randomPosition = CGPoint(x: Int(arc4random_uniform(width)), y: Int(arc4random_uniform(height)))
    tempFlower.position = randomPosition

    var tooClose = false
    flowerArray.append(tempFlower)

    // enumerate flowerArray
    for flower in flowerArray {

        // get the difference in position between the current node
        // and each node in the array
        let xPos = abs(flower.position.x - tempFlower.position.x)
        let yPos = abs(flower.position.y - tempFlower.position.y)

        // check if the spawn position is less than 10 for the x or y in relation
        // to the current node in the array
        if (xPos < 10) || (yPos < 10) {
            tooClose = true
        }
    }

    if tooClose == false {
        // Spawn node
        addChild(tempFlower)
    }
}
Другие вопросы по тегам