removeFromParent 不适用于 SKSpriteNode

removeFromParent doesn't work with SKSpriteNode

我想在我点击场景中的按钮时删除精灵。该按钮仅在玩家与物品发生碰撞时启用。这是添加和删除精灵的代码:

var imageShown = false
var imageForRiddle = SKSpriteNode()

func buttonAPressedForItem(item: WorldItem){
    if item.riddleImage != ""{
        imageForRiddle = SKSpriteNode(texture: SKTexture(imageNamed: item.riddleImage), color: .clear, size: CGSize(width: self.frame.size.width / 2, height: self.frame.size.height / 2))
        if !imageShown{
            imageForRiddle.position = player.position
            imageForRiddle.zPosition = 150
            self.addChild(imageForRiddle)
            imageShown = true
            print("Sprite added!")
        }
        else{
            imageForRiddle.removeFromParent()
            imageShown = false
            print("Sprite removed!")
        }
    }

行为应该是,如果我触摸按钮,就会显示图像。如果我再次触摸按钮,图像就会消失。但唯一发生的事情是当我点击按钮时图像出现但从未被删除。当我点击 3 次时,我看到图像 3 次。两个 print 语句都被执行,所以 imageForRiddle.removeFromParent 肯定被调用了。

有谁知道这里有什么问题吗?

您在每次点击时创建了一个新的 imageForRiddle:

imageForRiddle = SKSpriteNode(texture: SKTexture(imageNamed: item.riddleImage), color: .clear, size: CGSize(width: self.frame.size.width / 2, height: self.frame.size.height / 2))

因此,您正在制作一个新图像,然后将其删除(但是,它从未添加,因此被忽略)。

您需要使用您制作的 属性 来存储图像,并确保只制作一个并删除和添加完全相同的对象。

类似于:

var imageForRiddle: SKSpriteNode? = nil

然后,

if imageForRiddle = nil {
    imageForRiddle = SKSpriteNode(texture: SKTexture(imageNamed: item.riddleImage), color: .clear, size: CGSize(width: self.frame.size.width / 2, height: self.frame.size.height / 2))      
}

然后在使用时解包 imageForRiddle。