Ios 在update()中按下按钮时,如何生成一个int秒计数器?

Ios 在update()中按下按钮时,如何生成一个int秒计数器?,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在尝试制作第二个计数器,该计数器在GameSecene.update()中运行,当我按下按钮最多5秒时计数,然后停止并重置为0,等待再次按下按钮 这是我的if按钮被按下的代码: override func update(currentTime: CFTimeInterval) { if (Data.gameScene.buttonPressed == true) { player.texture = SKTexture(imageNamed: "Spaceship2

我正在尝试制作第二个计数器,该计数器在GameSecene.update()中运行,当我按下按钮最多5秒时计数,然后停止并重置为0,等待再次按下按钮

这是我的if按钮被按下的代码:

override func update(currentTime: CFTimeInterval) {

    if (Data.gameScene.buttonPressed == true) {
        player.texture = SKTexture(imageNamed: "Spaceship2")
        player.physicsBody = nil
    }
}
正如你所看到的,当按下按钮时,播放器就看不见了(太空船2的透明度很低),它不再有物理实体(所以敌人不能击中它)

我想要的是(在伪代码中):

if(按下按钮==true){
启动计时器
如果计时器<5秒{
玩家不能被击中,并且是隐形的
}否则{
玩家可以被击中并且是可见的
}
}

有人能帮我吗

只需设置一个5秒后启动的计时器:

class MyViewController: UIViewController {
    var timer: NStimer?
    var timerIsRunning = false

    func buttonPressed() {
        if timerIsRunning {
            return
        }

        // start the timer
        self.timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "update", userInfo: nil, repeats: false)
        self.timerIsRunning = true

        player.texture = SKTexture(imageNamed: "Spaceship2")
        player.physicsBody = nil
    }

    func update() {
        self.timer?.invalidate()
        self.timerIsRunning = false

        ...
    }

}

希望您能理解。

由于定期调用
update
函数,并方便地提供时间戳(以秒为单位),您只需在按下按钮时保存时间戳,并使用该时间戳确定5秒的结束时间

override func update(currentTime: CFTimeInterval) {

    if (Data.gameScene.buttonPressed == true) {
        player.texture = SKTexture(imageNamed: "Spaceship2")
        player.physicsBody = nil
        player.isInvisible = true
        player.startInvisible = currentTime
    }
    else if (player.isInvisible){
        if (currentTime - player.startInvisible > 5) {
            player.isInvisible = false
            player.texture = ...
            player.physicsBody = ...
        }
    }
}

您可以通过一系列等待操作和运行块操作来实现这一点

override func update(currentTime: CFTimeInterval) {

    if (Data.gameScene.buttonPressed == true) {
        //put code to make the player invisible

       let waitAction = SKAction.waitForDuration(5)
       let makePlayerVisibleAction = SKAction.runBlock {
           //put code to make the player visible
       }
       let action = SKAction.sequence([waitAction, makePlayerVisibleAction])

       player.runAction(action)  
    }
}

谢谢,这很有道理!但是,SKSpriteNode中不存在player.isInvisible和player.startInvisible。您是否假设这些已经是自定义函数?@DanTdd我假设您将创建一个具有附加属性的SKSpriteNode子类。这将允许多个游戏对象同时进入不可见模式(每个都有自己的时间戳)。但是,如果只允许一个节点(玩家的飞船)不可见,那么属性可能是场景的属性。嗯,不太清楚你的意思:(这是我的第一场比赛,我对这一切都很陌生。无法让它工作谢谢,我将在哪里调用按钮按下?太棒了,非常感谢!几乎可以正常工作!我现在的问题是我如何使玩家隐形,因为我正在使玩家物理体为零。当我重新启用它时,碰撞将不再工作。你知道一种隐藏pl的击球手方法吗那么它就不会碰撞了?别担心@akmidd我最后把玩家类别的位掩码改成了敌人5秒钟,然后又回到了玩家身上。
override func update(currentTime: CFTimeInterval) {

    if (Data.gameScene.buttonPressed == true) {
        //put code to make the player invisible

       let waitAction = SKAction.waitForDuration(5)
       let makePlayerVisibleAction = SKAction.runBlock {
           //put code to make the player visible
       }
       let action = SKAction.sequence([waitAction, makePlayerVisibleAction])

       player.runAction(action)  
    }
}