#png #wasm #编码

png2wasm4src

将索引PNG图像转换为WASM-4引擎的Rust源代码

1个不稳定版本

0.1.0 2021年10月18日

#346多媒体

27 每月下载

MIT 协议

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