rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// ゲームパッド入力 API の動作確認用サンプル。アセット不要(実機コントローラーが必要)。
//
// 確認対象: is_pad_connected / pad_count
//           is_pad_pressed / is_pad_just_pressed / is_pad_released / PadButton
//           pad_axis / PadAxis
//
// XInput(Xbox系)機とDirectInput機(それ以外のUSBパッド)の両方で確認するのが望ましい。

use rustraight::prelude::*;

const BUTTONS: &[(PadButton, &str)] = &[
    (PadButton::South, "South(A)"), (PadButton::East, "East(B)"),
    (PadButton::West, "West(X)"), (PadButton::North, "North(Y)"),
    (PadButton::LBumper, "LB"), (PadButton::RBumper, "RB"),
    (PadButton::LTrigger, "LT"), (PadButton::RTrigger, "RT"),
    (PadButton::Select, "Select"), (PadButton::Start, "Start"),
    (PadButton::LThumb, "LThumb"), (PadButton::RThumb, "RThumb"),
    (PadButton::DPadUp, "DUp"), (PadButton::DPadDown, "DDown"),
    (PadButton::DPadLeft, "DLeft"), (PadButton::DPadRight, "DRight"),
];

const AXES: &[(PadAxis, &str)] = &[
    (PadAxis::LeftStickX, "LStickX"), (PadAxis::LeftStickY, "LStickY"),
    (PadAxis::RightStickX, "RStickX"), (PadAxis::RightStickY, "RStickY"),
    (PadAxis::LeftTrigger, "LTrigAxis"), (PadAxis::RightTrigger, "RTrigAxis"),
];

fn main() {
    init(WindowConfig {
        title: String::from("08_gamepad"),
        width: 900,
        height: 600,
        screen_width: 900,
        screen_height: 600,
        ..Default::default()
    });

    while advance_frame() {
        draw_fill(MAIN_SCREEN, Color::rgb(15, 15, 20));
        draw_text(MAIN_SCREEN, 10, 6, format!("接続中のパッド数 pad_count(): {}", pad_count()), Color::YELLOW);

        for pad_id in 0..4usize {
            let base_y = 30 + pad_id as i32 * 140;
            let connected = is_pad_connected(pad_id);
            draw_text(
                MAIN_SCREEN, 10, base_y,
                format!("pad_id={pad_id}  is_pad_connected={connected}"),
                if connected { Color::GREEN } else { Color::rgb(100, 100, 100) },
            );
            if !connected { continue; }

            // ボタン
            for (i, (btn, label)) in BUTTONS.iter().enumerate() {
                let x = 10 + (i % 8) as i32 * 110;
                let y = base_y + 20 + (i / 8) as i32 * 20;
                let color = if is_pad_pressed(pad_id, *btn) { Color::GREEN } else { Color::rgb(120, 120, 120) };
                draw_text(MAIN_SCREEN, x, y, *label, color);

                if is_pad_just_pressed(pad_id, *btn) { log_info!("pad {pad_id} is_pad_just_pressed: {btn:?}"); }
                if is_pad_released(pad_id, *btn)     { log_info!("pad {pad_id} is_pad_released: {btn:?}"); }
            }

            // 軸(-1.0〜1.0 をバーで可視化)
            for (i, (axis, label)) in AXES.iter().enumerate() {
                let x = 10 + (i % 3) as i32 * 290;
                let y = base_y + 60 + (i / 3) as i32 * 20;
                let v = pad_axis(pad_id, *axis);
                draw_text(MAIN_SCREEN, x, y, format!("{label}: {v:+.2}"), Color::WHITE);
                draw_rectangle(MAIN_SCREEN, x + 100, y + 4, 100, 8, Color::rgb(60, 60, 60), true);
                let bar_w = ((v.clamp(-1.0, 1.0) + 1.0) * 0.5 * 100.0) as i32;
                draw_rectangle(MAIN_SCREEN, x + 100, y + 4, bar_w.max(1), 8, Color::CYAN, true);
            }
        }
    }
}