2017-06-04 3 views
2

私がテストしているアプリでは、グラデーション画像を背景として使用しています(サイズは590kbです)。私はこの画像を0.5ピクセルの縦線(19kb)に分割し、この画像を繰り返して同じ大きめの背景画像を作成する(1334回)ことができます。私は20の異なる背景画像を持っているので、アプリはストレージ使用量で11.8MB対380kbになるでしょう。複数のスプライト画像を1つに変換する

私は1334個のスプライトを持っているとは思っていませんが、ストレージを少なくするという考えがあります。では、1334個のイメージを1つのスプライトにまとめる方法はありますか?これが理にかなっているかどうかはわかりませんが、正しい方向へのプッシュは感謝します。

+1

ファイルの配列を作成し、それをNSDataファイルとして保存することができます。 –

+1

これを単純にテストしたいと思うかもしれません。シーンにノードの数、1秒あたりのフレーム数を表示してコールを描画し、多数の小さいスプライトでパフォーマンスがどのように変化するかを確認します。あるいは、11.8Mbの背景画像がそれほど多くないと受け入れてください。 –

+0

おかげでスティーブは、ええ、私は、1334スプライトを持つことは良いアイデアではないことを知っていた私は(基本的には、実行時に新しい.pngのファイルを作成する)1にそれらのすべての画像を変換する方法だろうが期待していた理由thatsの。 – Jarron

答えて

2

グラデーションを使用する場合は、画像を使用する必要はありません。これを見てください:

let context = CIContext() 
     if let filter = CIFilter(name: "CILinearGradient") 
     { 
      filter.setDefaults() 

      let startColor = CIColor(color: .gray) 
      let endColor = CIColor(color: .purple) 
      let startVector = CIVector(x: frame.width, y: 0) 
      let endVector = CIVector(x: frame.width, y: frame.height) 

      filter.setValue(startVector, forKey: "inputPoint0") 
      filter.setValue(endVector, forKey: "inputPoint1") 
      filter.setValue(startColor, forKey: "inputColor0") 
      filter.setValue(endColor, forKey: "inputColor1") 


      if let outputImage = filter.outputImage { 

       if let croppedImage = context.createCGImage(outputImage, from: CGRect(origin: CGPoint.zero, size: frame.size)){ 

        let background = SKSpriteNode(texture: SKTexture(cgImage: croppedImage)) 

        addChild(background) 
        background.zPosition = -20 

       } 

      } 

     } 

同じ効果を達成するために画像を水平または垂直に繰り返します。その場合は、thisのようなものを使用してコンテナノードからテクスチャを作成する必要があります。それでも、IMOをスキップし、グラデーションをプログラマチックに行うことができます。そして、確かに、私はバックグラウンドとして機能する多くのノードを残しています。それはばかげているだろう:)

+0

ありがとう旋風!私は昨日、プログラムでグラデーションエフェクトを作成し、それをスプライトのテクスチャとして使用する方法を理解しようと時間を費やしています。私はオンライン昨日読んですべてが非常に複雑に見えたが、何を提供していることは理解しやすく、御馳走のように動作します。 – Jarron

+0

@Jarronあなたは歓迎です;) – Whirlwind

関連する問題