rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// ブレンド/マスク API の動作確認用サンプル。
// 必要アセット: 検証素材/images/{sprite.png, mask.png}
//
// 確認対象: set_blend / BlendMode(Normal/Add/Mul)   set_mask / reset_mask

use rustraight::prelude::*;

fn asset(rel: &str) -> String {
    format!("{}/検証素材/{}", env!("CARGO_MANIFEST_DIR"), rel)
}

fn main() {
    init(WindowConfig {
        title: String::from("04_blend_mask"),
        width: 800,
        height: 500,
        screen_width: 800,
        screen_height: 500,
        ..Default::default()
    });

    let sprite = load_image(&asset("images/sprite.png"));
    let mask = load_image(&asset("images/mask.png"));

    while advance_frame() {
        draw_fill(MAIN_SCREEN, Color::rgb(15, 15, 20));

        // 背景に縞模様を敷いて、ブレンドモードの違いが分かるようにする
        let mut x = 0;
        while x < 800 {
            draw_rectangle(MAIN_SCREEN, x, 40, 10, 160, Color::rgb(60, 60, 90), true);
            x += 20;
        }

        let labels = [("Normal", BlendMode::Normal), ("Add", BlendMode::Add), ("Mul", BlendMode::Mul)];
        for (i, (name, mode)) in labels.iter().enumerate() {
            let x = 40 + i as i32 * 200;
            set_blend(*mode);
            draw_image(MAIN_SCREEN, x, 40, sprite);
            draw_text(MAIN_SCREEN, x, 210, format!("set_blend({name})"), Color::WHITE);
        }
        set_blend(BlendMode::Normal); // 後続の描画に影響を残さないよう戻す

        draw_text(MAIN_SCREEN, 10, 250, "上段: 同じ縞模様の上に3種のブレンドモードでスプライトを重ねた結果", Color::YELLOW);

        // マスクの確認: 左=マスク無し、中=マスク適用、右=マスク位置をずらした場合
        draw_image(MAIN_SCREEN, 40, 300, sprite);
        draw_text(MAIN_SCREEN, 40, 370, "マスク無し", Color::WHITE);

        set_mask(240, 300, mask); // マスク画像のアルファ形状でクリップ(座標はマスクの描画基準位置)
        draw_image(MAIN_SCREEN, 240, 300, sprite);
        reset_mask();
        draw_text(MAIN_SCREEN, 240, 370, "set_mask 適用 (mask.pngの形状でクリップ)", Color::WHITE);

        set_mask(470, 320, mask); // マスクをスプライトから20px下にずらす
        draw_image(MAIN_SCREEN, 440, 300, sprite);
        reset_mask();
        draw_text(MAIN_SCREEN, 440, 370, "マスクをずらした場合(一部だけ見えるはず)", Color::WHITE);
    }
}