1个不稳定版本
0.1.0 | 2021年10月18日 |
---|
#346 在 多媒体
27 每月下载
31KB
551 行
PNG到WASM-4源代码 (png2wasm4src)
将索引PNG图像转换为WASM-4引擎的Rust源代码。
https://gitlab.com/claudiomattera/png2wasm4src
WASM-4 是一个用WebAssembly实现的复古风格的幻想游戏机。游戏可以使用Rust(和其他语言)开发,并且运行时有支持绘制精灵的功能。精灵必须具有每像素一位或两位的位深,并且必须正确编码在变量中,这可以使用WASM-4 w4
命令行应用程序完成。
此包允许在Rust代码中执行转换,从而可以在build.rs
构建脚本中使用动态创建PNG图像的变量。
用法
此包可用于在cargo build
时自动从PNG图像生成Rust变量。这样,Rust变量始终反映当前的PNG图像,且不会忘记更新它们的风险。
假设以下包结构。目录 assets
包含一个子目录 sprites
,其中包含所有精灵。精灵组织在子目录中:精灵 letters.png
在目录 fonts
中,精灵 tiles.png
在目录 tiles
中。
.
├── assets
│ └── sprites
│ ├── fonts
│ │ └── letters.png
│ └── tiles
│ └── tiles.png
├── build.rs
├── Cargo.lock
├── Cargo.toml
└── src
└── lib.rs
现在可以从精灵PNG图像生成Rust代码,并在build.rs
构建脚本中。
use std::env::var;
use std::fs::{File, OpenOptions};
use std::io::Write;
use std::path::PathBuf;
use anyhow::Result;
use png2wasm4src::build_sprite_modules_tree;
fn main() -> Result<()> {
let module = build_sprite_modules_tree("assets/sprites")?;
// Instruct cargo to re-run the build script if any source PNGs are changed
// cargo:rerun-if-changed=assets/sprites/player.png
// cargo:rerun-if-changed=assets/sprites/monsters/slime.png
// cargo:rerun-if-changed=assets/sprites/monsters/bandit.png
let mut cargo_instructions = String::default();
module.generate_cargo_build_instructions(&mut cargo_instructions)?;
println!("{}", cargo_instructions);
let mut output_file = open_output_file()?;
let module = module.parse()?;
writeln!(output_file, "{}", module)?;
Ok(())
}
fn open_output_file() -> Result<File> {
let output_directory = PathBuf::from(var("OUT_DIR")?);
let output_path = output_directory.join("sprites.rs");
let output_file = OpenOptions::new()
.write(true)
.create(true)
.open(output_path)?;
Ok(output_file)
}
构建脚本生成以下代码,并将其写入文件 ${OUT_DIR}/sprites.rs
。
pub mod sprites {
pub mod fonts {
pub const LETTERS_WIDTH: u32 = 320;
pub const LETTERS_HEIGHT: u32 = 32;
pub const LETTERS_FLAGS: u32 = 1; // BLIT_2BPP
pub const LETTERS: [u8; 200] = [0x12, 0x34, 0x56...];
}
pub mod tiles {
pub const TILES_WIDTH: u32 = 32;
pub const TILES_HEIGHT: u32 = 32;
pub const TILES_FLAGS: u32 = 0; // BLIT_1BPP
pub const TILES: [u8; 30] = [0x12, 0x34, 0x56...];
}
}
从任何包模块中(例如在 lib.rs
中)都可以包含该文件,并使用那里定义的所有实体。
use wasm::*;
// Include the generated file in the current module.
//
// Note: this is done at top level, not inside any function (but it could be
// inside a module).
include!(concat!(env!("OUT_DIR"), "/sprites.rs"));
fn draw_sprite() {
blit(
sprites::tiles::TILES,
10,
10,
sprites::tiles::TILES_WIDTH,
sprites::tiles::TILES_HEIGHT,
sprites::tiles::TILES_FLAGS,
);
blit(
sprites::fonts::LETTERS,
10,
10,
sprites::fonts::LETTERS_WIDTH,
sprites::fonts::LETTERS_HEIGHT,
sprites::fonts::LETTERS_FLAGS,
);
}
许可协议
版权所有 Claudio Mattera 2021
您可以根据 MIT 许可协议 以署名方式自由复制、修改和分发此应用程序。有关详细信息,请参阅 License.txt
文件。
依赖关系
~3.5MB
~68K SLoC