Tôi sẽ đề nghị bạn thử TexturePacker
- bạn chỉ có thể kéo và thả tất cả hình ảnh của mình và đóng gói chúng
- bạn có thể áp dụng nén khác nhau - ví dụ: sử dụng các PNG được lập chỉ mục tiêu tốn ít bộ nhớ hơn - giảm tới 70% so với tệp PNG tiêu chuẩn
- bạn có thể tạo tệp dữ liệu tệp chứa tên + vị trí của từng tòa nhà của bạn
- phiên bản miễn phí có thể đã đủ để tạo các tấm sprite cho bạn
Bạn có sử dụng khung phát triển trò chơi như AndEngine, Cocos2d-x hoặc LibGdx không? => Không
Bạn có cần tất cả các hình ảnh của bạn được tải cùng một lúc? Có vẻ như bạn sẽ gặp vấn đề lớn về RAM trên các thiết bị mục tiêu.
Cập nhật: Snake gửi cho tôi một số hình ảnh. Như đã hứa sẽ không công khai chúng ở đây vì vậy tôi đã tự mình tạo ra một số nghệ thuật để trình bày cách giảm mức sử dụng bộ nhớ.
Trong ảnh gốc, chỉ có một phần của ảnh được di chuyển. Tôi đã đặt một con chim lên một ngôi nhà để chứng minh điều này:
Về cơ bản đóng gói các hình ảnh động hoàn chỉnh vào một tờ là một sự lãng phí lớn của bộ nhớ. Bạn nên chia các phần tĩnh và di chuyển:
Tĩnh:
Hoạt hình01:
Hoạt hình02:
Giữ vị trí ban đầu của con chim trong hình ảnh . Đây là lý do tại sao có không gian trống ở trên. Bạn cần điều này để căn chỉnh hình ảnh động.
Bây giờ kéo hình ảnh trên TexturePacker và chọn các tham số sau
- Định dạng dữ liệu: Hàm băm JSON (hoặc XML nếu bạn thích điều đó)
- TrimMode: Trim (điều này tạo ra hình chữ nhật)
- Định dạng pixel: INDEXED 8 bit - để tạo PNG 8 bit (bộ nhớ ít hơn khoảng 70%)
- Cho phép Xoay: sai
- Nhập tên tệp cho dữ liệu
Kết quả là bây giờ bạn nhận được 2 tệp: Bảng sprite và tệp mô tả 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}
},
Các phần quan trọng là frame và spriteSourceSize .
Các khung mang đến cho bạn vị trí của sprite gốc trong tờ ma.
spriteSourceSize cung cấp cho bạn phần bù để vẽ hình ảnh - các phần của hình ảnh bị bỏ qua vì cắt xén:
Một thói quen vẽ mã giả đơn giản trông như thế này:
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)
}
Bạn có thể phải điều chỉnh tính toán bù trừ tùy thuộc vào điểm / điểm gốc trong hệ thống đồ họa của bạn. Các thường trình ở trên giả định một hệ tọa độ có nguồn gốc là trên cùng bên trái.
Sau đó, chỉ cần vẽ ngôi nhà trong 2 lượt:
draw("background", 100, 100);
draw("anim_01", 100, 100);
Bạn không cần phải quan tâm đến việc bù đắp - vì hình ảnh đã được căn chỉnh.