如何使“ removeFromParent()”多次工作?

时间:2019-07-01 16:40:48

标签: ios swift xcode removechild addchild

我在随机位置的GameScene中加载了多个SpriteNode,但实际上是多次添加的同一SpriteNode。我在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 个答案:

答案 0 :(得分:1)

好吧,这是使用数组跟踪生成的对象的基础知识,以便您可以全部检查它们:

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)
        }
    }

}

注意:,这并不是从性能角度考虑的最佳方法,但足以使您理解。