如何在精灵套件中的按钮上设置冷却时间
Posted
技术标签:
【中文标题】如何在精灵套件中的按钮上设置冷却时间【英文标题】:how to set a cool down on a button in sprite kit 【发布时间】:2021-03-23 12:34:58 【问题描述】:override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
let positionInScene = touch!.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if let name = touchedNode.name
if name == "jumpbutton"
let wait = SKAction.wait(forDuration: 3)
let boost = SKAction.applyImpulse(CGVector(dx: 0.0, dy: 160.0), duration: 0.1)
let action = SKAction.group([boost, wait])
player!.run(action)
print("jumpbutton")
这是我的代码,我尝试在再次按下跳转按钮之前设置 3 秒的冷却时间。感谢您的帮助。
【问题讨论】:
【参考方案1】:有效的是创建一个标志来确定按下跳跃按钮是允许我们跳跃还是不允许我们跳跃(即它处于冷却状态)。
为此,您在类顶部附近创建一个名为 isReady
的变量并将其设置为 true。
在触摸的时候,我们要检查我们正在触摸的节点是否是跳转按钮(touchedNode.name == "jump button"
),以及按钮是否准备好(isReady == true
)。如果两者都等于 true,我们可以继续。我们首先设置标志isReady = false
,这样我们就不能立即再次运行这段代码(想想有人快速按下跳转按钮)。
下一部分是创建 boost 并运行它。
最后,我们创建一个持续时间为 3 秒的等待动作。我们运行这个等待操作,然后在完成时将标志设置回 true (isReady = true
)。
class GameScene: SKScene
var isReady = true
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
let positionInScene = touch!.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if touchedNode.name == "jumpbutton" && isReady == true
isReady = false
let boost = SKAction.applyImpulse(CGVector(dx: 0.0, dy: 160.0), duration: 0.1)
player!.run(boost)
print("jumpbutton")
let wait = SKAction.wait(forDuration: 3)
run(wait) [self] in
isReady = true
【讨论】:
非常感谢 John L,如果我没记错的话,您之前已经回答了我的问题。它有效,但我真的不知道如何,不过谢谢。 好的。你最终会明白的。总有一天你会需要调整它,一开始会很困难,但要坚持,不要放弃!祝你好运。【参考方案2】:你可以简单地用你喜欢做的动作来实现:
// Disable button
let waitAction = SKAction.wait(forDuration: coolDownTime)
run(waitAction) [weak self] in
// Enable button
为了扩展这个答案,我想建议创建一个组件,这样您就不需要处理 GameScene 上的每个按钮。
首先在文件 SKButton.swift 上创建您的按钮:
导入 SpriteKit
class SKButton: SKSpriteNode
var coolDownTime: TimeInterval = 2.0
var isReady: Bool = true
private var originalColor: UIColor = .red
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
super.touchesBegan(touches, with: event)
if isReady
print("This button was touched")
originalColor = color
color = .gray
isReady = false
let waitAction = SKAction.wait(forDuration: coolDownTime)
run(waitAction) [weak self] in
self?.isReady = true
self?.color = self?.originalColor ?? .blue
这是它在我的 GameScene 中工作的示例:
import SpriteKit
class GameScene: SKScene
override func didMove(to view: SKView)
super.didMove(to: view)
let myButton = SKButton()
myButton.position = CGPoint(x: frame.midX, y: frame.midY)
myButton.color = .red
myButton.size = CGSize(width: 200, height: 200)
myButton.isUserInteractionEnabled = true
addChild(myButton)
【讨论】:
感谢您的详细回复。在“weak self in”之后的第一个响应中启用我的按钮是什么意思。 可能是我在示例中使用的 if 语句,也可能是它自己的交互,如下所示:isUserInteractionEnabled = true 抱歉,我仍然难以对其进行冷却。如果你有时间,你能把它写出来,因为我老实说尝试了几次,但它仍然不起作用。谢谢。 如果你仍然有这个问题,我会分享一个例子repo上面的代码 不,很好的 John L 回答了我的问题。以上是关于如何在精灵套件中的按钮上设置冷却时间的主要内容,如果未能解决你的问题,请参考以下文章