How to create progress bar in sprite kit?

后端 未结 11 967
失恋的感觉
失恋的感觉 2020-12-28 17:56

I want to create my own progress bar in Sprite Kit.
I figured I will need to images - one fully empty progress bar and filled progress bar.
I have those images, I pu

11条回答
  •  心在旅途
    2020-12-28 18:25

    Swift 4:

    ( my answer 1 -> make a rapid and simple progress bar)

    To make a simple progress bar based to colors you can subclass a simple SKNode without using SKCropNode:

    class SKProgressBar: SKNode {
        var baseSprite: SKSpriteNode!
        var coverSprite: SKSpriteNode!
        override init() {
            super.init()
        }
        convenience init(baseColor: SKColor, coverColor: SKColor, size: CGSize ) {
            self.init()
            self.baseSprite = SKSpriteNode(color: baseColor, size: size)
            self.coverSprite = SKSpriteNode(color: coverColor, size: size)
            self.addChild(baseSprite)
            self.addChild(coverSprite)
        }
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        func setProgress(_ value:CGFloat) {
            print("Set progress bar to: \(value)")
            guard 0.0 ... 1.0 ~= value else { return }
            let originalSize = self.baseSprite.size
            var calculateFraction:CGFloat = 0.0
            self.coverSprite.position = self.baseSprite.position
            if value == 0.0 {
                calculateFraction = originalSize.width
            } else if 0.01..<1.0 ~= value {
                calculateFraction = originalSize.width - (originalSize.width * value)
            }
            self.coverSprite.size = CGSize(width: originalSize.width-calculateFraction, height: originalSize.height)
            if value>0.0 && value<1.0 {
                self.coverSprite.position = CGPoint(x:(self.coverSprite.position.x-calculateFraction)/2,y:self.coverSprite.position.y)
            }
        }
    }
    

    Usage:

    self.energyProgressBar = SKProgressBar.init(baseColor: .white, coverColor: .blue, size: CGSize(width:200,height:50))
    addChild(self.energyProgressBar)
    // other code to see progress changing..
    let wait = SKAction.wait(forDuration: 2.0)
    let action1 = SKAction.run {
        self.energyProgressBar.setProgress(0.7)
    }
    let action2 = SKAction.run {
        self.energyProgressBar.setProgress(0.0)
    }
    let action3 = SKAction.run {
        self.energyProgressBar.setProgress(1.0)
    }
    let action4 = SKAction.run {
        self.energyProgressBar.setProgress(0.5)
    }
    let action5 = SKAction.run {
        self.energyProgressBar.setProgress(0.1)
    }
    let sequence = SKAction.sequence([wait,action1,wait,action2,wait,action3,wait,action4,wait,action5])
    self.run(sequence)
    

    Output:

提交回复
热议问题