gpt4 book ai didi

swift - SKSpriteNode 在 Timer 到期时 removeFromParent() 后不会消失

转载 作者:可可西里 更新时间:2023-11-01 01:21:02 24 4
gpt4 key购买 nike

在我的游戏中,我希望每次我的玩家触摸一个物体时,屏幕都会变白约 0.5 秒,然后恢复正常。

我的代码是:

private var crash: SKSpriteNode?

func crashadd(){
crash = SKSpriteNode(imageNamed: "Gameplay BG")
crash?.anchorPoint = CGPoint(x: 0.5, y: 0.5)
crash?.position.x = 0
crash?.position.y = 0
crash?.zPosition = 15
mainCamera?.addChild(crash!)

Timer.scheduledTimer(timeInterval: TimeInterval(0.1), target: self, selector: #selector(GameplayScene.removeCrash), userInfo: nil, repeats: false)
}

func removeCrash() {
crash?.removeFromParent()
}

问题是 crash 节点有时不会自行移除。

最佳答案

您可能在计时器到期前第二次调用 crashadd()。如果这样做,它将覆盖对第一个 crash 的引用,但不会将其从屏幕上删除。当第一个计时器到期时,它将删除当前引用(第二个崩溃)。当第二个计时器到期时,它将尝试删除相同的 crash 并默默地失败。第一个 crash 永远不会被删除。

要解决这个问题,您可以进行检查以确保屏幕上没有崩溃。在 crashadd() 的顶部添加:

guard crash == nil else {
return
}

现在它将检查 crash 是否为空。如果不是,则该函数不执行任何操作就返回(因为屏幕上已经出现崩溃)。

由于崩溃可能会发生多次,因此您还应该添加

crash = nil

removeCrash() 的末尾清除它以备下次使用。


重要提示

您可能还应该查看多次调用 crashadd() 的位置,然后确定该行为是否是您真正想要的。

如果玩家连续触摸一个对象,您的代码可能会在每一帧调用 crashadd() 并在旧的 crash 过期后立即抛出一个新的 crash ,给人一种永远不会被移除的感觉。您需要确保每次碰撞只调用一次碰撞函数,而不是在碰撞持续时重复调用。

关于swift - SKSpriteNode 在 Timer 到期时 removeFromParent() 后不会消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43945246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com