如何在精灵套件中的按钮上设置冷却时间

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 回答了我的问题。

以上是关于如何在精灵套件中的按钮上设置冷却时间的主要内容,如果未能解决你的问题,请参考以下文章

如果用户将手指从精灵套件中的按钮上移开,如何停止按钮操作?

如何检测精灵套件中的碰撞?

如何在我的精灵套件游戏 Swift 中为所有 iPhone 获得相同的布局尺寸

检测精灵套件中的碰撞

精灵套件游戏中的计分系统

如何在精灵套件中旋转精灵节点?