【问题标题】:setup timer for a node为节点设置计时器
【发布时间】:2017-11-04 16:59:26
【问题描述】:

我试图为每个创建的节点设置一个计时器(通过触摸屏幕)。我想设置一个计时器来知道何时删除节点(通过使用 removefromparent)。我希望如果某个节点在某个位置定位 5 秒,那么它将从屏幕上删除。 我是 swift 的新手,我真的不知道应该如何设置计时器。我使用这个初始化:

let ballTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: <#T##(Timer) -> Void#>)

我知道“withTimeInterval”用于设置第二个 - 所以我将其设置为 1。“重复”和“块”属性我并没有真正得到,所以我不确定我是否使用了正确的功能.

谁能帮我解决这个问题?

【问题讨论】:

    标签: swift timer sprite-kit sknode


    【解决方案1】:

    如果您使用 Spritekit,则无需使用计时器。 Spritekit 有自己的内置计时机制,游戏循环调用更新,以及在指定时间运行动作以触发事件的方式。

    let ball = SKSpriteNode(color: red, size: CGSize: CGSize(width: 100, height: 100))
    ball.zPosition = 1
    ball.position = CGPoint(x: 100, y: 100)
    addChild(ball)
    
    let wait = SKAction.wait(forDuration: 5.0)
    let remove = SKAction.removeFromParent()
    let sequence = SKAction.sequence([wait, remove])
    
    ball.run(sequence)
    

    【讨论】:

    • 那不是我真正要找的,如果节点(球)的位置在某个点并且在那里持续 5 秒,我想删除它。
    • 你的帖子里没有这么说,我建议你修改它以更好地反映你的问题
    • 修复一下,谢谢!也许你能帮我解决这个问题?
    • 这是要走的路,尽量让你的更新循环保持整洁
    【解决方案2】:

    您应该使用场景的update() 功能。该覆盖运行每一帧,因此您可以检查您的定位,并跟踪每个节点,您可以启动或重新启动 wait() 操作,该操作在完成时删除节点。

    类似的,

    if ball.position.x == 200 && ball.position.y == 200 {
        let wait = SKAction.wait(forDuration: 5.0)
        let remove = SKAction.removeFromParent()
        let sequence = SKAction.sequence([wait, remove])
    
        ball.run(sequence)
    }else{
        ball.removeAllActions()
    }
    

    注意:您不应该使用这样的特定坐标,使用至少几个点的范围或将 x 和 y 值四舍五入。

    【讨论】:

    • tnx!如何使用范围?
    • ' if ball.position.x >= 199 && ball.position.x
    【解决方案3】:

    感谢帮助!我最终做的是:

        override func update(_ currentTime: TimeInterval) {
        self.enumerateChildNodes(withName: "BALL") { (node:SKNode, nil) in
            if node.position.y <= 25 || node.position.x <= 50 {
                let wait = SKAction.wait(forDuration: 3.0)
                let remove = SKAction.removeFromParent()
                let sequence = SKAction.sequence([wait, remove])
                print("in range")
                node.run(sequence)
            }
        }
    }
    

    首先,我通过更新函数运行它,然后按节点名称 (BALL) 搜索节点,然后使用 heValyreanGroup 答案将其从视图中删除。

    【讨论】:

    • 这是处理代码的糟糕方式。您正在做的是在场景根中搜索任何称为球的东西,并在每一帧中进行处理。这是一个很大的浪费时间。我建议保留你找到的东西,这样你就不需要每次都搜索。为了让你更清楚一点。假设你有一本百科全书 B,你正在写一篇关于球的读书报告。现在想象一下,每次需要时都必须搜索“Ball”,这将非常耗时。相反,您可以在 Ball 上放置一个书签,以便您下次需要时快速访问它。
    • 好的,我发布我的答案,以便获得反馈和意见。首先,谢谢!二、有没有更好的方法,能不能给我看看怎么用?
    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2020-10-17
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多