2017-06-04 3 views
2

In einer App, die ich gerade ausprobiere, verwende ich ein Hintergrundbild als Hintergrund (590 KB groß). Ich habe die Fähigkeit, dieses Bild in 0,5 Pixel vertikale Streifen (19kb) zu zerlegen und dieses Bild sich selbst zu wiederholen (1334 Mal), um das gleiche größere Hintergrundbild zu erzeugen. Ich habe 20 verschiedene Hintergrundbilder insgesamt, so dass die App 11.8mb vs 380kb in Speicherverbrauch sein wird.Konvertieren mehrerer Sprite-Bilder in einen

Ich mag die Idee nicht, 1334 Sprites zu haben, aber ich mag die Idee, weniger Speicher zu verwenden. Also, gibt es eine Möglichkeit, die 1334 Bilder zu einem Sprite zu verflachen? Nicht sicher, ob dies sinnvoll ist, aber jeder Stoß in die richtige Richtung wäre willkommen.

+1

Sie können ein Array von Dateien erstellen und als NSData-Datei speichern. –

+1

Vielleicht möchten Sie dies einfach testen. Lassen Sie Ihre Szene die Anzahl der Knoten, Frames pro Sekunde und Zeichenaufrufe anzeigen und sehen Sie, wie sich die Leistung mit vielen kleinen Sprites und weniger großen Sprites ändert. Alternativ, akzeptieren Sie einfach, dass 11,8 MB Hintergrundbilder nicht wirklich so viel ist. –

+0

Danke Steve, yeah Ich wusste, 1334 Sprite zu haben war keine gute Idee, deshalb hatte ich gehofft, dass es eine Möglichkeit geben würde, all diese Bilder in eins zu konvertieren (im Grunde eine neue .png Datei zur Laufzeit). – Jarron

Antwort

2

Sie müssen kein Bild verwenden, wenn Sie einen Farbverlauf haben möchten. Schau dir das an:

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 

       } 

      } 

     } 

Es ist möglich, ein Bild horizontal oder vertikal zu wiederholen, um den gleichen Effekt zu erzielen. Das würde erfordern Textur von einem Container-Knoten mit etwas wie this erstellen. Dennoch, IMO, können Sie das überspringen und programmatisch Gradienten tun. Und sicherlich würde ich davon absehen, viele Knoten zu haben, die als Hintergrund dienen. Das wäre albern :)

+0

Danke Wirbelwind! Ich habe gestern Stunden damit verbracht, herauszufinden, wie man den Gradienteneffekt programmatisch erzeugt und als Textur für ein Sprite verwendet. Alles, was ich gestern online gelesen habe, schien sehr kompliziert zu sein, aber was Sie zur Verfügung gestellt haben, ist leicht zu verstehen und funktioniert wie ein Leckerbissen. – Jarron

+0

@Jarron Gern geschehen;) – Whirlwind

Verwandte Themen