Eu proporia que você tente o TexturePacker
- você pode simplesmente arrastar e soltar todas as suas imagens e empacotá-las
- você pode aplicar compactação diferente - por exemplo, usar PNGs indexados que consomem muito menos memória - até 70% menos em comparação com um arquivo PNG padrão
- você pode criar um arquivo de dados que contém o nome + a posição de cada um de seus edifícios
- a versão gratuita já pode ser suficiente para criar as folhas de sprite para você
Você usa uma estrutura de desenvolvimento de jogos como AndEngine, Cocos2d-x ou LibGdx? => Nenhum
Você precisa de todas as suas imagens carregadas ao mesmo tempo? Parece que você terá grandes problemas de RAM nos dispositivos de destino.
Atualização: Snake me enviou algumas imagens. Como prometido, não os tornará públicos aqui, então eu mesmo criei algumas artes para demonstrar como reduzir o uso de memória.
Na imagem original, apenas uma parte da imagem estava em movimento. Coloquei um pássaro em uma casa para demonstrar isso:

Basicamente, empacotar a animação completa em uma folha é um grande desperdício de memória. Você deve dividir as partes estáticas e móveis:
Estático:

Anim01:

Anim02:

Mantenha a posição original do pássaro nas imagens . É por isso que há tanto espaço vazio acima. Você precisa disso para alinhar a animação.
Agora arraste as imagens no TexturePacker e selecione os seguintes parâmetros
- Formato de dados: hash JSON (ou XML, se você preferir)
- TrimMode: Trim (isso cria retângulos)
- Formato de pixel: 8 bits INDEXADO - para criar PNGs de 8 bits (cerca de 70% menos memória)
- Permitir rotação: false
- Digite um nome de arquivo para os dados

O resultado é que agora você obtém 2 arquivos: a folha de sprite e um arquivo de descrição 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}
},
As partes importantes são frame e spriteSourceSize .
O quadro fornece a localização do sprite original na folha de sprite.
spriteSourceSize fornece o deslocamento para desenhar a imagem - as partes da imagem que são deixadas de fora devido ao corte:
Uma rotina simples de desenho de pseudo-código se parece com isso:
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)
}
Pode ser necessário ajustar o cálculo do deslocamento, dependendo do ponto / origem do pivô no seu sistema gráfico. A rotina acima pressupõe um sistema de coordenadas cuja origem é superior esquerda.
Em seguida, basta desenhar a casa em 2 passagens:
draw("background", 100, 100);
draw("anim_01", 100, 100);
Você não precisa se preocupar com as compensações - já que as imagens já estão alinhadas.