Swift:如何在动画SKShapenode倒计时中使计时器无效?

时间:2015-11-08 20:50:57

标签: swift

好吧我正在构建一个sprite kit游戏,在我之前的一个问题上,我得到的代码让一个圈子skshapenode“放松”按照一个用完的计时器(这样圆圈已经消失了)计时器完成)。

以下是我的问题:Swift, sprite kit game: Have circle disappear in clockwise manner? On timer? 以下是我一直在使用的代码:

func addCircle() {

        circle = SKShapeNode(circleOfRadius: 50)
        let circleColor = UIColor(red: 102/255, green: 204/255, blue: 255/255, alpha: 1)
        circle.fillColor = circleColor
        circle.strokeColor = SKColor.clearColor()
        circle.position = CGPoint (x: self.frame.size.width * 0.5, y: self.frame.size.height * 0.5+45)
        circle.zPosition = 200
        circle.zRotation = CGFloat(M_PI_2)
        addChild(circle)

        countdown(circle, steps: 120, duration: 5) { //change steps to change how much of the circle it takes away at a time

                //Performed when circle timer ends:
                print("circle done")
                self.gameSoundTrack.stop()

                self.removeAllChildren()
                self.removeAllActions()
                self.viewController.removeSaveMe(self)

                self.GOSceneNodes() //Implements GOScene
                self.viewController.addGOScene(self) //Implements GOViewController
        }

    }
// Creates an animated countdown timer
    func countdown(circle:SKShapeNode, steps:Int, duration:NSTimeInterval, completion:()->Void) {
        let radius = CGPathGetBoundingBox(circle.path).width/2
        let timeInterval = duration/NSTimeInterval(steps)
        let incr = 1 / CGFloat(steps)
        var percent = CGFloat(1.0)

        let animate = SKAction.runBlock({
            percent -= incr
            circle.path = self.circle(radius, percent:percent)
        })
        let wait = SKAction.waitForDuration(timeInterval)
        let action = SKAction.sequence([wait, animate])

        runAction(SKAction.repeatAction(action,count:steps-1)) {
            self.runAction(SKAction.waitForDuration(timeInterval)) {
                circle.path = nil
                completion()
            }
        }
    }

    // Creates a CGPath in the shape of a pie with slices missing
    func circle(radius:CGFloat, percent:CGFloat) -> CGPath {
        let start:CGFloat = 0
        let end = CGFloat(M_PI*2) * percent
        let center = CGPointZero
        let bezierPath = UIBezierPath()
        bezierPath.moveToPoint(center)
        bezierPath.addArcWithCenter(center, radius: radius, startAngle: start, endAngle: end, clockwise: true)
        bezierPath.addLineToPoint(center)
        return bezierPath.CGPath
    }

这一切都运作良好,但如果按下游戏中的另一个按钮,我需要一种方法来使圆圈的倒计时无效,这样当计时器用完时执行的所有内容(上面//Performed when circle timer ends:之后的所有内容)都是不执行。

我试过了

        circle.removeAllActions()
        circle.removeFromParent()

按下按钮时,这只会删除圆圈,即使圆圈消失,一切仍然都会执行。

我对Swift很陌生,我无法弄清楚我需要使这三个函数中的哪一部分无效或停止以便停止倒计时完成。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以通过向操作添加密钥来停止操作,然后运行

removeActionForKey("actionKey")

要为操作添加密钥,请使用以下内容替换countdown方法:

// Creates an animated countdown timer
func countdown(circle:SKShapeNode, steps:Int, duration:NSTimeInterval, completion:()->Void) {
    let radius = CGPathGetBoundingBox(circle.path).width/2
    let timeInterval = duration/NSTimeInterval(steps)
    let incr = 1 / CGFloat(steps)
    var percent = CGFloat(1.0)

    let animate = SKAction.runBlock({
        percent -= incr
        circle.path = self.circle(radius, percent:percent)
    })
    let wait = SKAction.waitForDuration(timeInterval)
    let action = SKAction.sequence([wait, animate])

    let completed = SKAction.runBlock{
        circle.path = nil
        completion()
    }

    let countDown = SKAction.repeatAction(action,count:steps-1)
    let sequence = SKAction.sequence([countDown, SKAction.waitForDuration(timeInterval),completed])

    runAction(sequence, withKey: "actionKey")
}