rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// 画像・スプライト API の動作確認用サンプル。
// 必要アセット: 検証素材/images/{sprite.png, spritesheet.png, photo.jpg}
//
// 確認対象: load_image / load_div_image / free_image / image_size
//           draw_image / draw_image_ex (scale/rotation/alpha/flip)
//           存在しないパスを渡した際の代替スプライト(8x8マゼンタ)へのフォールバック

use rustraight::prelude::*;

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

fn main() {
    init(WindowConfig {
        title: String::from("03_sprites"),
        width: 900,
        height: 500,
        screen_width: 900,
        screen_height: 500,
        ..Default::default()
    });

    let sprite  = load_image(&asset("images/sprite.png"));
    let tiles   = load_div_image(&asset("images/spritesheet.png"), 4, 32, 32);
    let photo   = load_image(&asset("images/photo.jpg"));
    let missing = load_image(&asset("images/does_not_exist.png")); // 存在しないパス → 代替スプライト

    let (sw, sh) = image_size(sprite);
    let (mw, mh) = image_size(missing);
    let mut freed = false;
    let mut flip_x = false;
    let mut flip_y = false;

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

        draw_text(MAIN_SCREEN, 10, 6, format!("sprite.png size: {sw}x{sh}   代替スプライト size: {mw}x{mh}"), Color::WHITE);
        draw_text(MAIN_SCREEN, 10, 24, "F: free_image(sprite)  X/Y: draw_image_exのflip切替", Color::YELLOW);

        // load_image + draw_image(等倍)。free_image 後は何も描かれなくなるはず
        draw_image(MAIN_SCREEN, 20, 60, sprite);
        draw_text(MAIN_SCREEN, 20, 140, "draw_image (等倍)", Color::WHITE);

        // draw_image_ex: 拡大 + 回転アニメーション + アルファ点滅 + 反転切替
        if is_just_pressed(KeyCode::KeyX) { flip_x = !flip_x; }
        if is_just_pressed(KeyCode::KeyY) { flip_y = !flip_y; }
        let angle = (elapsed_time() as f32 * 60.0) % 360.0;
        let alpha = ((elapsed_time().sin() as f32) * 0.5 + 0.5).clamp(0.2, 1.0);
        draw_image_ex(MAIN_SCREEN, 160, 60, sprite, DrawImageParams {
            scale_x: 2.0, scale_y: 2.0,
            rotation: angle,
            alpha,
            flip_x, flip_y,
        });
        draw_text(MAIN_SCREEN, 160, 230, "draw_image_ex (2倍/回転/アルファ点滅/反転)", Color::WHITE);

        // load_div_image で分割した4タイルを並べる
        for (i, tile) in tiles.iter().enumerate() {
            draw_image(MAIN_SCREEN, 20 + i as i32 * 40, 280, *tile);
        }
        draw_text(MAIN_SCREEN, 20, 320, "load_div_image (4タイル)", Color::WHITE);

        // 存在しないパス → 代替スプライト(8x8マゼンタ)を4倍表示
        draw_image_ex(MAIN_SCREEN, 20, 360, missing, DrawImageParams {
            scale_x: 4.0, scale_y: 4.0, rotation: 0.0, alpha: 1.0, flip_x: false, flip_y: false,
        });
        draw_text(MAIN_SCREEN, 20, 400, "存在しないパス→代替スプライト(4倍)", Color::WHITE);

        // photo.jpg(WIC JPEGデコード経路の確認)
        draw_image_ex(MAIN_SCREEN, 600, 60, photo, DrawImageParams {
            scale_x: 0.3, scale_y: 0.3, rotation: 0.0, alpha: 1.0, flip_x: false, flip_y: false,
        });
        draw_text(MAIN_SCREEN, 600, 230, "photo.jpg (JPEGデコード, 0.3倍)", Color::WHITE);

        // free_image の確認(一方向。解放後は draw_image が黙って何も描かなくなる)
        if is_just_pressed(KeyCode::KeyF) && !freed {
            free_image(sprite);
            freed = true;
        }
        draw_text(MAIN_SCREEN, 20, 440, format!("sprite handle freed: {freed}"), if freed { Color::RED } else { Color::GREEN });
    }
}