Proponuję wypróbowanie TexturePacker
- możesz po prostu przeciągnąć i upuścić wszystkie swoje obrazy i spakować je
- możesz zastosować inną kompresję - np. użyć zindeksowanych plików PNG, które zużywają znacznie mniej pamięci - do 70% mniej w porównaniu ze standardowym plikiem PNG
- możesz utworzyć plik danych, który zawiera nazwę + pozycję każdego z twoich budynków
- darmowa wersja może już wystarczyć, aby utworzyć arkusze sprite dla Ciebie
Czy korzystasz ze środowiska programowania gier, takiego jak AndEngine, Cocos2d-x lub LibGdx? => Brak
Czy potrzebujesz wszystkich zdjęć ładowanych jednocześnie? Wygląda na to, że napotkasz ogromne problemy z pamięcią RAM na urządzeniach docelowych.
Aktualizacja: Snake przesłał mi kilka zdjęć. Jak obiecałem, nie opublikuję ich tutaj, więc sam stworzyłem sztukę, aby zademonstrować, jak zmniejszyć zużycie pamięci.
Na oryginalnym obrazie poruszała się tylko jedna część obrazu. Umieściłem ptaka w domu, aby to zademonstrować:
Zasadniczo upakowanie całej animacji na arkuszu jest dużym marnotrawstwem pamięci. Powinieneś podzielić części statyczne i ruchome:
Statyczny:
Anim01:
Anim02:
Zachowaj pierwotną pozycję ptaka na zdjęciach . Właśnie dlatego jest tak pusta przestrzeń powyżej. Potrzebujesz tego do wyrównania animacji.
Teraz przeciągnij obrazy na TexturePacker i wybierz następujące parametry
- Format danych: skrót JSON (lub XML, jeśli wolisz)
- TrimMode: Trim (tworzy prostokąty)
- Format pikseli: INDEKSOWANY 8-bitowy - do tworzenia 8-bitowych plików PNG (około 70% mniej pamięci)
- Allow Rotation: false
- Wprowadź nazwę pliku dla danych
W rezultacie otrzymujesz teraz 2 pliki: arkusz sprite i plik opisu JSON.
"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}
},
Ważnymi częściami są rama i spriteSourceSize .
Rama daje lokalizację oryginalnego ikonki w arkuszu ikonki.
spriteSourceSize daje przesunięcie do rysowania obrazu - części obrazu, które zostały pominięte z powodu przycinania:
Prosta procedura rysowania pseudokodu wygląda następująco:
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)
}
Może być konieczne dostosowanie obliczenia przesunięcia w zależności od punktu obrotu / początku w systemie graficznym. Powyższa procedura zakłada układ współrzędnych, którego początek znajduje się w lewym górnym rogu.
Następnie po prostu narysuj dom w 2 przejściach:
draw("background", 100, 100);
draw("anim_01", 100, 100);
Nie musisz przejmować się przesunięciami - ponieważ obrazy są już wyrównane.