#aseprite #tile #layer

mabel-aseprite

加载Aseprite文件的实用工具

1 个不稳定版本

0.3.9 2024年5月27日

#426 in 图像


mabel中使用

MIT许可证

5MB
4K SLoC

Rust 3.5K SLoC // 0.1% comments C++ 444 SLoC // 0.1% comments Shell 18 SLoC

加载Aseprite文件的实用工具。此库直接读取二进制Aseprite文件(文件格式规范),无需将文件导出为JSON。这应该足以在游戏启动时快速加载您的资源。您还可以使用它来构建自己的资源管道。

请注意,在没有优化编译时,此库可能会相当慢。我们建议您通过在Cargo.toml中添加以下内容来在开发模式下覆盖此依赖项的优化设置:

[profile.dev.package.asefile]
opt-level = 2  # or 3

如果您已经有了通配符覆盖,则不需要这样做。有关更多信息,请参阅Cargo配置文件覆盖

基本用法

加载文件

最简单的方法是使用AsepriteFile::read_file来加载文件。

use asefile::AsepriteFile;
let ase = AsepriteFile::read_file(&path).unwrap();

println!("Size: {}x{}", ase.width(), ase.height());
println!("Frames: {}", ase.num_frames());
println!("Layers: {}", ase.num_layers());

将帧保存为图像

Aseprite文件由多个图层组成。通常您只需要最终的图像。您可以使用Frame::image来完成此操作。这将返回来自image库的image::RgbaImage

let image = ase.frame(0).image();
let output_path = output_dir.join("example.png");
image.save(&output_path).unwrap();

这将像Aseprite一样合并所有可见图层。

图层

您可以通过名称或ID访问[图层]。

let layer = ase.layer(0);
println!("Name of layer 0: {}", layer.name());
let layer = ase.layer_by_name("Layer 1").unwrap();
println!("Layer 1 is visible? {}", layer.is_visible());

帧是帧和图层的交集。因此,有多种方法可以访问帧


let layer0 = ase.layer(0);
// These are all the same cel
let cel1 = layer0.frame(1);
let cel2 = ase.frame(1).layer(0);
let cel3 = ase.cel(1, 0); // or directly, which can avoid some borrowing issues

let image = cel1.image();

瓦片集

从Aseprite 1.3开始,您还可以创建瓦片集和瓦片图层。

您可以单独访问每个瓦片,或者将它们全部导出为一张宽度为单个瓦片的图像。


let num_tilesets = ase.tilesets().len();
let tileset = ase.tilesets().get(0).unwrap();

let all_tiles: RgbaImage = tileset.image();
let single_tile: RgbaImage = tileset.tile_image(1);
// Note: tile 0 is the empty tile
assert_eq!(
all_tiles.dimensions().0,
tileset.tile_size().width() as u32
);
assert_eq!(
all_tiles.dimensions().1,
tileset.tile_size().height() as u32 * tileset.tile_count()
)

瓦片图

Aseprite还支持瓦片图,它们是由瓦片集组成的图层。

您可以将其作为单个大图像导出,或者通过查看图层中的瓦片索引进行一些自定义处理。


let layer = ase.layer_by_name("Tilemap 1").unwrap().id();
let tilemap = ase.tilemap(layer, 0).unwrap();

// This is the same as getting the image for the cel.
let tilemap_image = tilemap.image();

let num_tiles_x = tilemap.width();
let num_tiles_y = tilemap.height();
let (tile_width, tile_height) = tilemap.tile_size();
// Get a specific tile. Always succeeds. If the tile is out of bounds returns
// the empty tile (id 0).
let tile = tilemap.tile(0, 1);
println!("tile at (0, 1) references tile from tileset: {}", tile.id());
// You can access the tileset right through the tilemap.
let image = tilemap.tileset().tile_image(tile.id());

用户数据

Aseprite为您提供选项,可以注解某些实体以自定义数据。通常,这只是一个颜色和一个文本字段。每个这样的实体都有一个user_data()方法。

依赖项