1 个不稳定版本
0.3.9 | 2024年5月27日 |
---|
#426 in 图像
在mabel中使用
5MB
4K 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()
方法。