按住键的同时在第一个字符和下一个字符之间延迟

时间:2018-09-30 20:22:50

标签: swift xcode macos sprite-kit

我正在尝试创建一个macOS SpriteKit游戏,在该游戏中,玩家将按住箭头键以使节点(玩家)移动。当我使用 keyDown(with:) 时,我看到按住一个键时会出现第一个字符,然后有一个延迟,然后出现所有其他字符。诸如此类:第一个字符> 延迟> 字符,直到停止按住键为止

这是我的keyDown代码:

override func keyDown(with event: NSEvent) {
    switch event.keyCode {
/*
    case 0x31:
        if let label = self.label {
            label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
        }
*/
    case 0x7C: // Right Arrow
        print("RightArrow pressed!")
        playerNode.run(SKAction.moveTo(x: playerNode.position.x + 7, duration: 0.1))
    case 0x7B: // Left Arrow
        print("LeftArrow pressed!")
        playerNode.run(SKAction.moveTo(x: playerNode.position.x - 7, duration: 0.1))
    case 0x7E: // Up Arrow
        print("UpArrow pressed!")
        playerNode.run(SKAction.moveTo(y: playerNode.position.y + 7, duration: 0.1))
    case 0x7D: // Down Arrow
        print("DownArrow pressed!")
        playerNode.run(SKAction.moveTo(y: playerNode.position.y - 7, duration: 0.1))
    default:
        print("keyDown: \(event.characters!) keyCode: \(event.keyCode)")
    }
}

有人知道如何让我的SpriteNode平稳移动吗?

谢谢!

编辑:由于我的问题被设置为重复,因此我想详细解释一下。.我看到了建议的答案,但实际上并没有帮助我...答案是创建一个时间,我做了:

var myTimer = Timer()

然后,在我的开关盒0x7C中(在文本中较高的位置),我添加了此内容:

myTimer = Timer.scheduledTimer(timeInterval: 0.0, target: self, selector: #selector(GameScene.movePlayerRight), userInfo: nil, repeats: false)

然后,我创建了selector调用的函数:

@objc func movePlayerRight() {
    playerNode.run(SKAction.moveTo(x: playerNode.position.x + 7, duration: 0.1))
}

所以是的。。。这就是我现在的位置。我尝试了一些事情:将计划的计时器重复设置为true,然后在键按下时执行myTimer.invalidate()。它工作得很好,我就像:O ...但是当您长时间按下该键时,SpriteNode不会停止移动,所以我猜想Timer不会失效...

如果对此一无所知或想出可能的答案,请告诉我!

谢谢!

0 个答案:

没有答案