2017-02-20 8 views
2

これは現在進行状況バーのコードです。 GameSceneで私はvar xProgress = 1を設定しました。空のイメージは、値が今は0になるはずですか?SKSpriteNodeでヘルスプログレスバーを作成するスウィフト

SKNodeを時間の経過とともに値が減少する前にテストして、ゆっくりと減少させようとしています。私GameSceneで

class IMProgressBar : SKNode{ 

var emptySprite : SKSpriteNode? = nil 
var progressBar : SKCropNode 
init(emptyImageName: String!,filledImageName : String) 
{ 
    progressBar = SKCropNode() 
    super.init() 
    let filledImage = SKSpriteNode(imageNamed: filledImageName) 
    progressBar.addChild(filledImage) 
    progressBar.maskNode = SKSpriteNode(color: UIColor.white, 
             size: CGSize(width: filledImage.size.width * 2, height: filledImage.size.height * 2)) 

    progressBar.maskNode?.position = CGPoint(x: -filledImage.size.width/2,y: -filledImage.size.height/2) 
    progressBar.zPosition = 0.1 
    self.addChild(progressBar) 

    if emptyImageName != nil{ 
     emptySprite = SKSpriteNode.init(imageNamed: emptyImageName) 
     self.addChild(emptySprite!) 
    } 
} 
func setXProgress(xProgress : CGFloat){ 
    var value = xProgress 
    if xProgress < 0.1{ 
     value = 0 
    } 
    if xProgress > 0.1 { 
     value = 0 
    } 
    progressBar.maskNode?.xScale = value 
} 

    required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
} 

私も持っている:

let progressBar = IMProgressBar(emptyImageName: nil,filledImageName: "health") 
    progressBar.position = CGPoint(x: self.frame.midX, y: self.frame.height/3) 
    self.addChild(progressBar) 
+1

何かがそれらを打つときにそれを減少させ、変数に選手の健康を保存するために、より普通になり、それがゼロに達するとゲームが終了します。プレイヤーは値を表示するために画面上にそれを別々に表示しますが、ディスプレイから値を読み取ったり試したりしないでください。 – simonWasHere

+0

私はこの質問ではあまり明確ではありません。プログレスバーは燃料棒の多くです。したがって、プレイヤーはバーである燃料レベルを上げるためにスプライトノードと頻繁に衝突する必要があります。 –

+0

燃料値を変数に保存する方が良いです – simonWasHere

答えて

2

あなたは一つのノードがバーで、もう一方が背景である2つのスプライト・ノードを使用して、プログレスバーを実装することができます。

まず、同じサイズでバーや背景のノードを作成します。

background = SKSpriteNode(color:SKColor.white, size:size) 
bar = SKSpriteNode(color:color, size:size) 

次へ]を、バーのzPosition背景よりも高い値に設定されているので、バーが背景の上に表示されます。 anchorPoint(0, 0.5)に設定してバーを左揃えにし、バーの位置を背景の左端に設定します。

bar.zPosition = 1.0 
bar.anchorPoint = CGPoint(x:0.0,y:0.5) 
bar.position = CGPoint(x:-size.width/2,y:0) 

最後に、valueを含め、0と1の間の値である

bar.xScale = value 

によってx方向のバーをスケーリングすることによって進捗量を設定します。

ここSKNodeのサブクラスとして完全な実装です:

class ProgressBar:SKNode { 
    var background:SKSpriteNode? 
    var bar:SKSpriteNode? 
    var _progress:CGFloat = 0 
    var progress:CGFloat { 
     get { 
      return _progress 
     } 
     set { 
      let value = max(min(newValue,1.0),0.0) 
      if let bar = bar { 
       bar.xScale = value 
       _progress = value 
      } 
     } 
    } 

    convenience init(color:SKColor, size:CGSize) { 
     self.init() 
     background = SKSpriteNode(color:SKColor.white,size:size) 
     bar = SKSpriteNode(color:color,size:size) 
     if let bar = bar, let background = background { 
      bar.xScale = 0.0 
      bar.zPosition = 1.0 
      bar.position = CGPoint(x:-size.width/2,y:0) 
      bar.anchorPoint = CGPoint(x:0.0,y:0.5) 
      addChild(background) 
      addChild(bar) 
     } 
    } 
} 

は、用法:

let progressBar = ProgressBar(SKColor.blue, size:CGSize(width:100, height:10)) 

addChild(progressBar) 

progressBar.progress = 0.5 
関連する問題