Я б запропонував спробувати TexturePacker
- ви можете просто перетягнути всі свої зображення та упакувати їх
- Ви можете застосовувати різні стиснення - наприклад, використовувати індексовані PNG, які споживають набагато менше пам'яті - до 70% менше порівняно зі стандартним файлом PNG
- ви можете створити файли даних файлів, які містять ім’я + положення кожної вашої будівлі
- безкоштовної версії вже може бути достатньо для створення спрайтових аркушів для вас
Ви використовуєте рамки для розробки ігор, як AndEngine, Cocos2d-x або LibGdx? => Немає
Чи потрібні всі ваші зображення завантажені одночасно? Це здається, що у вас виникнуть великі проблеми з оперативною пам’яттю на цільових пристроях.
Оновлення: Змія надіслала мені кілька зображень. Як було обіцяно, тут вони не будуть оприлюднюватися, тому я створив собі мистецтво, щоб продемонструвати, як зменшити використання пам'яті.
У оригінальному зображенні рухалася лише одна частина зображення. Я помістив птицю на будинок, щоб продемонструвати це:
В основному упаковка цілої анімації в аркуш - це велика трата пам’яті. Ви повинні розділити статичні та рухомі частини:
Статичний:
Anim01:
Anim02:
Зберігайте початкове положення птаха на зображеннях . Ось чому вище такого порожнього простору. Це вам потрібно для вирівнювання анімації.
Тепер перетягніть зображення на TexturePacker і виберіть наступні параметри
- Формат даних: хеш JSON (або XML, якщо ви бажаєте цього)
- TrimMode: обрізка (це створює прямокутники)
- Формат пікселів: INDEXED 8bit - для створення 8-бітних PNG (приблизно на 70% менше пам'яті)
- Дозволити обертання: помилково
- Введіть ім'я файлу для даних
У результаті ви отримаєте 2 файли: спрайтовий лист та файл опису 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}
},
Важливими частинами є кадр і spriteSourceSize .
Кадр дає розташування вихідного спрайту в спрайт листа.
spriteSourceSize дає зсув для малювання зображення - частини зображення, які залишилися поза обрізкою:
Простий розпорядок малювання псевдокодом виглядає так:
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)
}
Можливо, вам доведеться скорегувати розрахунок зміщення залежно від точки зведення / початку в графічній системі. Звичайна схема передбачає систему координат, походження якої вліво вліво.
Потім просто намалюйте будинок за 2 проходи:
draw("background", 100, 100);
draw("anim_01", 100, 100);
Не потрібно дбати про компенсації - оскільки зображення вже вирівняні.