1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#![forbid(missing_docs)]
#![forbid(unsafe_code)]
#![warn(clippy::doc_markdown)]
#![doc = include_str!("../README.md")]
use crate::action_state::ActionState;
use crate::input_map::InputMap;
use bevy::ecs::prelude::*;
use bevy::reflect::{FromReflect, Reflect, TypePath};
use std::hash::Hash;
pub mod action_diff;
pub mod action_driver;
pub mod action_state;
pub mod axislike;
pub mod buttonlike;
pub mod clashing_inputs;
pub mod common_conditions;
mod display_impl;
pub mod errors;
pub mod input_map;
pub mod input_mocking;
pub mod input_streams;
pub mod orientation;
pub mod plugin;
pub mod systems;
pub mod timing;
pub mod user_input;
// Importing the derive macro
pub use leafwing_input_manager_macros::Actionlike;
/// Everything you need to get started
pub mod prelude {
pub use crate::action_driver::ActionStateDriver;
pub use crate::action_state::ActionState;
pub use crate::axislike::{
DeadZoneShape, DualAxis, MouseWheelAxisType, SingleAxis, VirtualAxis, VirtualDPad,
};
pub use crate::buttonlike::MouseWheelDirection;
pub use crate::clashing_inputs::ClashStrategy;
pub use crate::input_map::InputMap;
#[cfg(feature = "ui")]
pub use crate::input_mocking::MockUIInteraction;
pub use crate::input_mocking::{MockInput, QueryInput};
pub use crate::user_input::{InputKind, Modifier, UserInput};
pub use crate::plugin::InputManagerPlugin;
pub use crate::plugin::ToggleActions;
pub use crate::{Actionlike, InputManagerBundle};
}
/// Allows a type to be used as a gameplay action in an input-agnostic fashion
///
/// Actions are modelled as "virtual buttons", cleanly abstracting over messy, customizable inputs
/// in a way that can be easily consumed by your game logic.
///
/// This trait should be implemented on the `A` type that you want to pass into [`InputManagerPlugin`](crate::plugin::InputManagerPlugin).
///
/// Generally, these types will be very small (often data-less) enums.
/// As a result, the APIs in this crate accept actions by value, rather than reference.
/// While `Copy` is not a required trait bound,
/// users are strongly encouraged to derive `Copy` on these enums whenever possible to improve ergonomics.
///
/// # Example
/// ```rust
/// use bevy::prelude::Reflect;
/// use leafwing_input_manager::Actionlike;
///
/// #[derive(Actionlike, PartialEq, Eq, Clone, Copy, Hash, Reflect)]
/// enum PlayerAction {
/// // Movement
/// Up,
/// Down,
/// Left,
/// Right,
/// // Abilities
/// Ability1,
/// Ability2,
/// Ability3,
/// Ability4,
/// Ultimate,
/// }
/// ```
pub trait Actionlike:
Eq + Hash + Send + Sync + Clone + Hash + Reflect + TypePath + FromReflect + 'static
{
}
/// This [`Bundle`] allows entities to collect and interpret inputs from across input sources
///
/// Use with [`InputManagerPlugin`](crate::plugin::InputManagerPlugin), providing the same enum type to both.
#[derive(Bundle)]
pub struct InputManagerBundle<A: Actionlike> {
/// An [`ActionState`] component
pub action_state: ActionState<A>,
/// An [`InputMap`] component
pub input_map: InputMap<A>,
}
// Cannot use derive(Default), as it forces an undesirable bound on our generics
impl<A: Actionlike> Default for InputManagerBundle<A> {
fn default() -> Self {
Self {
action_state: ActionState::default(),
input_map: InputMap::default(),
}
}
}