在我的游戏中,我想要的是,每当我的玩家触摸一个物体时,屏幕会变白并持续约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
节点有时无法自行删除。
答案 0 :(得分:2)
你可能在计时器到期之前第二次调用crashadd()
。如果您这样做,它将覆盖对第一个crash
的引用,但不会将其从屏幕中删除。当第一个计时器到期时,它将删除当前参考(第二个crash
)。当第二个计时器到期时,它将尝试删除相同的crash
并静默失败。第一个crash
永远不会删除。
要解决此问题,您可以进行检查以确保屏幕上还没有crash
。在crashadd()
:
guard crash == nil else {
return
}
现在它会检查crash
是否为空。如果不是,则该函数返回而不做任何事情(因为屏幕上已经出现崩溃)。
由于崩溃可能会多次发生,因此您还应添加
crash = nil
在removeCrash()
的末尾,以便下次清除它。
重要提示
您可能还应该多次查看您正在调用crashadd()
的位置,并确定该行为是否是您真正想要的。
如果播放器不断触摸某个对象,那么您的代码可能会在每一帧都调用crashadd()
并在旧版本到期后立即抛出新的crash
,从而显示它永远不会被删除。您需要确保每次碰撞只调用一次碰撞功能,而不是在碰撞持续时反复调用。