当Timer过期时,SKFriteNode在removeFromParent()之后不会消失

时间:2017-05-12 19:34:51

标签: swift timer sprite-kit nstimer skspritenode

在我的游戏中,我想要的是,每当我的玩家触摸一个物体时,屏幕会变白并持续约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节点有时无法自行删除。

1 个答案:

答案 0 :(得分:2)

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

要解决此问题,您可以进行检查以确保屏幕上还没有crash。在crashadd()

的顶部添加此项
guard crash == nil else {
    return
}

现在它会检查crash是否为空。如果不是,则该函数返回而不做任何事情(因为屏幕上已经出现崩溃)。

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

crash = nil

removeCrash()的末尾,以便下次清除它。

重要提示

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

如果播放器不断触摸某个对象,那么您的代码可能会在每一帧都调用crashadd()并在旧版本到期后立即抛出新的crash,从而显示它永远不会被删除。您需要确保每次碰撞只调用一次碰撞功能,而不是在碰撞持续时反复调用。