2016-07-24 8 views
2

私はあなたのアドバイスが必要です。私はSpriteKitを新しくしました。アニメーションストリップを作成する必要があります。私はそれを作るための3つの解決策がありますが、私はより良い、より低コストのCPUのアドバイスが必要です。SpriteKit animation

  • 1溶液:各ストライプ - アニメーションおよびテクスチャ
  • 2溶液とSKSpriteNode:背景ビデオ
  • 3溶液:各ストライプ -

enter image description here

+1

CPU使用率に関して最も高いパフォーマンスは、手作業でデコードされた後、SKActionでアニメーション化される一連のPNG画像の使用になります。このアプローチの欠点は、多くのメモリ使用量です。背景ビデオは60 FPSフレームレートを処理できない可能性があります。 SKShapeNodeアプローチは、各フレームをレンダリングする必要があるため、多くのCPUを消費する可能性があります。 – MoDJ

+1

シンプルな色のスプライトはテクスチャ付きスプライトよりも速く、任意の寸法にすることができます。 – BadgerBadger

+0

@MoDJこの場合、テクスチャは必要ないと同意します... – Whirlwind

答えて

2

これはアニメーションでSKShapeNode単純なタスクでは、アトラスアニメーションを作成する必要はなく、SKShapeNodeを使用する場合はSKSpriteNodeをこのコードとして使用できます。

var bar = SKSpriteNode(color: SKColor.greenColor(), size: CGSizeMake(40, 200)) 
barra.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
self.addChild(barra) 

ランダムなサイズのn個のバーを作成し、それらを移動するにはSKActionを使用します。

この方法では、アニメーションは起動するたびに異なります。詳細で

コード:

class GameScene: SKScene { 
    var bars: [SKSpriteNode]! 
    var totBars : Int = 50 
    override func didMoveToView(view: SKView) { 
     self.backgroundColor = SKColor(red: 131/255, green: 190/255, blue: 177/255, alpha: 1) 
     let redBarColor = SKColor(red: 204/255, green: 75/255, blue: 75/255, alpha: 1) 
     let yellowBar = SKColor(red: 253/255, green: 242/255, blue: 160/255, alpha: 1) 
     // add here your colors 
     var colorSelected:SKColor = redBarColor 
     bars = [SKSpriteNode]() 
     for i in 0..<totBars-1 { 
      let colorNum = randomNumber(1...2) 
      switch (colorNum) { 
      case 1: 
       colorSelected = redBarColor 
      case 2: 
       colorSelected = yellowBar 
      default: 
      break 
      } 
      let randomWidth = randomCGFloat(5,max:40) 
      let randomHeight = randomCGFloat(30,max:400) 
      let bar = SKSpriteNode.init(color: colorSelected, size: CGSizeMake(randomWidth, randomHeight)) 
      bar.zRotation = -45 * CGFloat(M_PI/180.0) 
      bar.name = "bar\(i)" 
      self.addChild(bar) 
      bars.append(bar) 
     } 
     animateBars() 
    } 
    func animateBar(bar:SKSpriteNode) { 
     print("- \(bar.name) start!") 
     let deltaX = self.randomCGFloat(0,max:self.frame.maxX) 
     let deltaY:CGFloat = self.frame.maxY/2 
     let rightPoint = CGPointMake(self.frame.maxX + deltaX,self.frame.maxY + deltaY) 
     let leftPoint = CGPointMake(-self.frame.maxX + deltaX,-self.frame.maxY + deltaY) 
     bar.position = rightPoint 
     let waitBeforeExit = SKAction.waitForDuration(Double(self.randomCGFloat(1.0,max:2.0))) 
     let speed = self.randomCGFloat(150,max:300) 
     let move = SKAction.moveTo(leftPoint, duration: self.getDuration(rightPoint, pointB: leftPoint, speed: speed)) 
     bar.runAction(SKAction.sequence([waitBeforeExit,move]), completion: { 
      print("\(bar.name) reached position") 
      self.animateBar(bar) 
     }) 
    } 
    func animateBars() { 
     for bar in bars { 
      animateBar(bar) 
     } 
    } 
    func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval { 
     let xDist = (pointB.x - pointA.x) 
     let yDist = (pointB.y - pointA.y) 
     let distance = sqrt((xDist * xDist) + (yDist * yDist)); 
     let duration : NSTimeInterval = NSTimeInterval(distance/speed) 
     return duration 
    } 
    func randomCGFloat(min: CGFloat, max: CGFloat) -> CGFloat { 
     return CGFloat(Float(arc4random())/Float(UINT32_MAX)) * (max - min) + min 
    } 
    func randomNumber(range: Range<Int> = 1...6) -> Int { 
     let min = range.startIndex 
     let max = range.endIndex 
     return Int(arc4random_uniform(UInt32(max - min))) + min 
    } 
} 
+0

よろしくお願いいたします。私はskskitenodeそれは良い方法だと思うが、私はそれについて疑問に思う –

+0

あなたの疑問は何ですか? –

+0

パフォーマンスについて。私はCPUの性能に多くの問題を抱えていましたが、私はこのベストソリューションを探しています –

0

は、あなたの質問に答えるためには、ソリューション3は、あなたのCPUのための最もコストのかからない方法です。 Here'reこれが真であるいくつかの理由:あなたがアニメーションとテクスチャでSKSpriteNodeを示唆している

最初のソリューションは、」ビューにテクスチャをロードするためにコンピュータを必要としますが、複数の.pngファイルがある場合、。これはコンピュータがこれらすべてのファイルをロードする必要があることを意味しますが、SKShapeNodeを使用する場合、これを行う必要はありません。SKShapeNodeがイメージに基づいていないのと同じ外観を安価に作成できます。

2.ソリューション2は、ビデオを実行しているため、CPUにとって最もコストがかかります。これは、あなたがあなたの携帯電話でそれを実行する場合、ラグを作成するかもしれないメモリ。

また、ソリューション1と2を広範囲に使用する場合は、あまりに多くのメモリを使用することになります。しかし、ソリューション3を使用する場合は、これに対処しません。

+0

実際、「SKShapeNode」は何があっても最悪の解決策です。なぜなら、 'SKShapeNode'という色付きの' SKShapeNode'ではなく、この特定の場合に 'SKShapeNode'をなぜ使用するのですか?バッチでレンダリングされますか? IMOでは、 'SKShapeNode'は現在の問題について言及する価値がありません。 – Whirlwind

1

ストライプが単純な長方形の場合は、SKSpriteNodesを使用して寸法と色のみを与え、次にアクションを使用してアニメーションを付けることができます。四角形を回転させて、画像に表示する効果を与えることができます。

実際にXcodeでエディタを使ってアニメーション全体を構築し、独自のSKSファイルに保存し、SKReferenceNodeを使ってアニメーションを読み込むことができます。

0

もう1つのオプションは、すでに説明したものに加えて、バックグラウンド用のGLSLシェーダを書くことです。ゲームの残りの部分とやりとりしないクールな背景がほしいのなら、これはGPU上で起こる可能性が高いため、おそらく最も効果的なオプションになるでしょう。

矩形をレンダリングすることもできます。イメージはまったく必要なく、色の領域だけなので、レンダリングすることもできます。

ここには、トピックのまともな紹介があります:Battle of Brothers GLSL Introduction