检查 Sprite Kit 中的触摸是否处于活动状态 (Swift)

Check if touch is active in Sprite Kit (Swift)

所以,这是我第一次在 Sprite Kit 中开发游戏。这对我来说是一次很棒的学习经历!

但是,我遇到了一个问题 :( 我不知道如何在触摸处于活动状态时重复调用一个函数(例如,每 0.5 秒调用一个函数,触摸是 'touching')。所以,我正在考虑有一个 SKAction 运行,然后在触摸被释放时 cancel/delete 它......但我决定反对。

相反,我希望有一个功能来检查是否有触摸,但不一定是按下、释放或更改位置,即检查是否有感动就是感动,句号。

如果这不可能,那么我最初想到的克服这个困境的最简单方法是什么,还是有更简单的方法?

非常感谢!

如果我是你,我会使用 SKAction(或多个),因为在我看来,它有助于使我的代码更简洁;你 运行 一个 SKAction 在一个地方然后你就不用再担心了。这有助于使 update 方法摆脱大量游戏逻辑。

在您的评论中,您提到不确定如何使用 SKAction 调用函数。您可以为此使用 SKAction.runBlock;它需要一个没有参数和 returns Void 的闭包(或函数)。

或者,您可以使用 SKAction.customAction... 创建您自己的操作 运行ning 函数,尽管在这种情况下不合适。该文档有更多关于自定义操作的信息,这里有一个简单的例子:How to create custom SKActions?

无论如何,这就是我实现您所追求的目标的方法:

class GameScene: SKScene {
    let actionID = "TouchActionID"

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let wait = SKAction.waitForDuration(0.5)
        let block = SKAction.runBlock { println("Hello World") }
        let sequence = SKAction.sequence([wait, block])

        // Use `actionID`, defined earlier, as the key. 
        // This allows you to cancel the `SKAction`.
        self.runAction(SKAction.repeatActionForever(sequence), withKey: actionID)
    }

    // Cancel the SKAction if the touch ended or was cancelled. Cancelling 
    // could occur if the application resigns being active, for example.
    // See UIResponder documentation for more information.
    override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
        self.removeActionForKey(actionID)
    }

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
        self.removeActionForKey(actionID)
    }
}

希望对您有所帮助!