Ich würde vorschlagen, dass Sie TexturePacker versuchen
- Sie können einfach alle Ihre Bilder ziehen und ablegen, um sie zu packen
- Sie können eine andere Komprimierung anwenden - z. B. indizierte PNGs verwenden, die deutlich weniger Speicherplatz verbrauchen - bis zu 70% weniger als eine Standard-PNG-Datei
- Sie können Dateidatendateien erstellen, die den Namen und die Position jedes Ihrer Gebäude enthalten
- Die kostenlose Version könnte bereits ausreichen, um die Sprite-Blätter für Sie zu erstellen
Verwenden Sie ein Spieleentwicklungs-Framework wie AndEngine, Cocos2d-x oder LibGdx? => Keine
Müssen alle Bilder gleichzeitig geladen werden? Es hört sich so an, als würden Sie auf den Zielgeräten auf massive RAM-Probleme stoßen.
Update: Snake hat mir ein paar Bilder geschickt. Wie versprochen, werden sie hier nicht veröffentlicht. Deshalb habe ich selbst einige Kunstwerke geschaffen, um zu demonstrieren, wie der Speicherverbrauch reduziert werden kann.
Im Originalbild bewegte sich nur ein Teil des Bildes. Ich habe einen Vogel auf ein Haus gesetzt, um dies zu demonstrieren:
Grundsätzlich ist das Packen der gesamten Animation auf ein Blatt eine große Verschwendung von Speicher. Sie sollten statische und bewegliche Teile aufteilen:
Statisch:
Anim01:
Anim02:
Behalten Sie die ursprüngliche Position des Vogels in den Bildern . Deshalb gibt es so mich leeren Raum oben. Sie benötigen dies zum Ausrichten der Animation.
Ziehen Sie nun die Bilder auf TexturePacker und wählen Sie die folgenden Parameter aus
- Datenformat: JSON-Hash (oder XML, wenn Sie das bevorzugen)
- TrimMode: Trim (erzeugt Rechtecke)
- Pixelformat: INDEXED 8bit - zum Erstellen von 8-Bit-PNGs (ca. 70% weniger Speicher)
- Drehung zulassen: false
- Geben Sie einen Dateinamen für die Daten ein
Das Ergebnis ist, dass Sie jetzt 2 Dateien erhalten: Das Sprite-Sheet und eine JSON-Beschreibungsdatei.
"house_anim_01.png":
{
"frame": {"x":351,"y":246,"w":110,"h":79},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":67,"y":8,"w":110,"h":79},
"sourceSize": {"w":400,"h":400},
"pivot": {"x":0.5,"y":0.5}
},
Die wichtigen Teile sind Frame und SpriteSourceSize .
Der Rahmen gibt Ihnen die Position des ursprünglichen Sprites im Sprite-Sheet an.
spriteSourceSize gibt den Versatz für das Zeichnen des Bildes an - die Teile des Bildes, die aufgrund des Zuschneidens ausgelassen werden:
Eine einfache Pseudo-Code-Zeichenroutine sieht folgendermaßen aus:
drawImage(spritename, posX, posX)
{
data = sheetData[spritename]
offsetX = data.spriteSourceSize.x
offsetY = data.spriteSourceSize.y
frameX = data.frame.x
frameY = data.frame.y
width = data.frame.w
height = data.frame.h
screen.draw(sheetImage, posX+offsetX, posY+offsetY, width, height)
}
Möglicherweise müssen Sie die Versatzberechnung abhängig vom Drehpunkt / Ursprung in Ihrem Grafiksystem anpassen. Die obige Routine setzt ein Koordinatensystem voraus, dessen Ursprung oben links liegt.
Dann zeichnen Sie das Haus einfach in 2 Durchgängen:
draw("background", 100, 100);
draw("anim_01", 100, 100);
Sie müssen sich nicht um die Offsets kümmern, da die Bilder bereits ausgerichtet sind.