检查 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)
}
}
希望对您有所帮助!
所以,这是我第一次在 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)
}
}
希望对您有所帮助!