reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use reaction::mapping::action::InputAction;
use reaction::mapping::binding::{BindingConfig, InputBinding};
use reaction::mapping::resolver::InputMap;
use reaction::prelude::*;

fn main() {
    let mut map = InputMap::new();

    // Bind A (Left) and D (Right) to MoveX
    map.bind(
        InputAction::MoveX,
        BindingConfig::new(InputBinding::Key(KeyCode::KeyA))
            .with_scale(-1.0)
            .unwrap(),
    )
    .unwrap();
    map.bind(
        InputAction::MoveX,
        BindingConfig::new(InputBinding::Key(KeyCode::KeyD))
            .with_scale(1.0)
            .unwrap(),
    )
    .unwrap();

    let mut input = AdvancedInputState::new();

    println!("Simulation: Opposing Inputs Cancellation");
    println!("---------------------------------------");

    println!("Frame 1: Pressing 'D' (Right)");
    input.keyboard.press(KeyCode::KeyD, 0.0, 1);
    let val1 = map.resolve(InputAction::MoveX, &input, None);
    println!(" -> MoveX Value: {} (Moving Right)", val1);

    println!("\nFrame 2: Also Pressing 'A' (Left)");
    input.keyboard.press(KeyCode::KeyA, 0.0, 2);
    let val2 = map.resolve(InputAction::MoveX, &input, None);
    println!(" -> MoveX Value: {} (CANCELLED)", val2);

    if val2.abs() < 0.001 {
        println!(" ✅ Success: Opposed inputs resulted in zero output!");
    }

    println!("\nFrame 3: Releasing 'D' (Keep 'A' pressed)");
    input.keyboard.release(KeyCode::KeyD, 3);
    let val3 = map.resolve(InputAction::MoveX, &input, None);
    println!(" -> MoveX Value: {} (Moving Left)", val3);
}