Struct leafwing_input_manager::input_map::InputMap
source · pub struct InputMap<A: Actionlike> { /* private fields */ }
Expand description
Maps from raw inputs to an input-method agnostic representation
Multiple inputs can be mapped to the same action, and each input can be mapped to multiple actions.
The provided input types must be able to be converted into a UserInput
.
By default, if two actions are triggered by a combination of buttons,
and one combination is a strict subset of the other, only the larger input is registered.
For example, pressing both S
and Ctrl + S
in your text editor app would save your file,
but not enter the letters s
.
Set the ClashStrategy
resource
to configure this behavior.
§Example
use bevy::prelude::*;
use leafwing_input_manager::prelude::*;
use leafwing_input_manager::user_input::InputKind;
// You can Run!
// But you can't Hide :(
#[derive(Actionlike, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
enum Action {
Run,
Hide,
}
// Construction
let mut input_map = InputMap::new([
// Note that the type of your iterators must be homogenous;
// you can use `InputKind` or `UserInput` if needed
// as unifying types
(Action::Run, GamepadButtonType::South),
(Action::Hide, GamepadButtonType::LeftTrigger),
(Action::Hide, GamepadButtonType::RightTrigger),
]);
// Insertion
input_map.insert(Action::Run, MouseButton::Left)
.insert(Action::Run, KeyCode::ShiftLeft)
// Chords
.insert_modified(Action::Run, Modifier::Control, KeyCode::KeyR)
.insert_chord(Action::Run,
[InputKind::PhysicalKey(KeyCode::KeyH),
InputKind::GamepadButton(GamepadButtonType::South),
InputKind::Mouse(MouseButton::Middle)],
);
// Removal
input_map.clear_action(&Action::Hide);
Implementations§
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn handle_clashes(
&self,
action_data: &mut HashMap<A, ActionData>,
input_streams: &InputStreams<'_>,
clash_strategy: ClashStrategy
)
pub fn handle_clashes( &self, action_data: &mut HashMap<A, ActionData>, input_streams: &InputStreams<'_>, clash_strategy: ClashStrategy )
Resolve clashing inputs, removing action presses that have been overruled
The usize
stored in pressed_actions
corresponds to Actionlike::index
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn new(
bindings: impl IntoIterator<Item = (A, impl Into<UserInput>)>
) -> Self
pub fn new( bindings: impl IntoIterator<Item = (A, impl Into<UserInput>)> ) -> Self
Creates a new InputMap
from an iterator of (user_input, action)
pairs
To create an empty input map, use the Default::default
method instead.
§Example
use leafwing_input_manager::input_map::InputMap;
use leafwing_input_manager::Actionlike;
use bevy::input::keyboard::KeyCode;
use bevy::prelude::Reflect;
#[derive(Actionlike, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
enum Action {
Run,
Jump,
}
let input_map = InputMap::new([
(Action::Run, KeyCode::ShiftLeft),
(Action::Jump, KeyCode::Space),
]);
assert_eq!(input_map.len(), 2);
sourcepub fn build(&mut self) -> Self
pub fn build(&mut self) -> Self
Constructs a new InputMap
from a &mut InputMap
, allowing you to insert or otherwise use it
This is helpful when constructing input maps using the “builder pattern”:
- Create a new
InputMap
struct usingInputMap::default
orInputMap::new
. - Add bindings and configure the struct using a chain of method calls directly on this struct.
- Finish building your struct by calling
.build()
, receiving a concrete struct you can insert as a component.
Note that this is not the original input map, as we do not have ownership of the struct.
Under the hood, this is just a more-readable call to .clone()
.
§Example
use leafwing_input_manager::prelude::*;
use bevy::input::keyboard::KeyCode;
use bevy::prelude::Reflect;
#[derive(Actionlike, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
enum Action {
Run,
Jump,
}
let input_map: InputMap<Action> = InputMap::default()
.insert(Action::Jump, KeyCode::Space).build();
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn insert(&mut self, action: A, input: impl Into<UserInput>) -> &mut Self
pub fn insert(&mut self, action: A, input: impl Into<UserInput>) -> &mut Self
Insert a mapping between input
and action
sourcepub fn insert_one_to_many(
&mut self,
action: A,
input: impl IntoIterator<Item = impl Into<UserInput>>
) -> &mut Self
pub fn insert_one_to_many( &mut self, action: A, input: impl IntoIterator<Item = impl Into<UserInput>> ) -> &mut Self
Insert a mapping between many input
’s and one action
sourcepub fn insert_multiple(
&mut self,
input_action_pairs: impl IntoIterator<Item = (A, impl Into<UserInput>)>
) -> &mut Self
pub fn insert_multiple( &mut self, input_action_pairs: impl IntoIterator<Item = (A, impl Into<UserInput>)> ) -> &mut Self
Insert a mapping between the provided input_action_pairs
This method creates multiple distinct bindings.
If you want to require multiple buttons to be pressed at once, use insert_chord
.
Any iterator convertible into a UserInput
can be supplied.
sourcepub fn insert_chord(
&mut self,
action: A,
buttons: impl IntoIterator<Item = impl Into<InputKind>>
) -> &mut Self
pub fn insert_chord( &mut self, action: A, buttons: impl IntoIterator<Item = impl Into<InputKind>> ) -> &mut Self
Insert a mapping between the simultaneous combination of buttons
and the action
provided
Any iterator convertible into a InputKind
can be supplied,
but will be converted into a HashSet
for storage and use.
Chords can also be added with the insert method if the UserInput::Chord
variant is constructed explicitly.
When working with keyboard modifier keys, consider using the insert_modified
method instead.
sourcepub fn insert_modified(
&mut self,
action: A,
modifier: Modifier,
input: impl Into<InputKind>
) -> &mut Self
pub fn insert_modified( &mut self, action: A, modifier: Modifier, input: impl Into<InputKind> ) -> &mut Self
Inserts a mapping between the simultaneous combination of the Modifier
plus the input
and the action
provided.
When working with keyboard modifiers, should be preferred over insert_chord
.
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn gamepad(&self) -> Option<Gamepad>
pub fn gamepad(&self) -> Option<Gamepad>
Fetches the [Gamepad] associated with the entity controlled by this entity map
If this is None
, input from any connected gamepad will be used.
sourcepub fn set_gamepad(&mut self, gamepad: Gamepad) -> &mut Self
pub fn set_gamepad(&mut self, gamepad: Gamepad) -> &mut Self
Assigns a particular [Gamepad
] to the entity controlled by this input map
If this is not called, input from any connected gamepad will be used. The first matching non-zero input will be accepted, as determined by gamepad registration order.
Because of this robust fallback behavior, this method can typically be ignored when writing single-player games.
sourcepub fn clear_gamepad(&mut self) -> &mut Self
pub fn clear_gamepad(&mut self) -> &mut Self
Clears any [Gamepad] associated with the entity controlled by this input map
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn pressed(
&self,
action: &A,
input_streams: &InputStreams<'_>,
clash_strategy: ClashStrategy
) -> bool
pub fn pressed( &self, action: &A, input_streams: &InputStreams<'_>, clash_strategy: ClashStrategy ) -> bool
Is at least one of the corresponding inputs for action
found in the provided input
streams?
Accounts for clashing inputs according to the ClashStrategy
.
If you need to inspect many inputs at once, prefer InputMap::which_pressed
instead.
sourcepub fn which_pressed(
&self,
input_streams: &InputStreams<'_>,
clash_strategy: ClashStrategy
) -> HashMap<A, ActionData>
pub fn which_pressed( &self, input_streams: &InputStreams<'_>, clash_strategy: ClashStrategy ) -> HashMap<A, ActionData>
Returns the actions that are currently pressed, and the responsible UserInput
for each action
Accounts for clashing inputs according to the ClashStrategy
.
source§impl<A: Actionlike> InputMap<A>
impl<A: Actionlike> InputMap<A>
sourcepub fn iter(&self) -> impl Iterator<Item = (&A, &Vec<UserInput>)>
pub fn iter(&self) -> impl Iterator<Item = (&A, &Vec<UserInput>)>
Returns an iterator over actions with their inputs
sourcepub fn get(&self, action: &A) -> Option<&Vec<UserInput>>
pub fn get(&self, action: &A) -> Option<&Vec<UserInput>>
Returns a reference to the inputs mapped to action
Trait Implementations§
source§impl<A: Actionlike> Component for InputMap<A>
impl<A: Actionlike> Component for InputMap<A>
source§impl<A: Actionlike> Default for InputMap<A>
impl<A: Actionlike> Default for InputMap<A>
source§impl<'de, A> Deserialize<'de> for InputMap<A>where
A: Deserialize<'de> + Actionlike,
impl<'de, A> Deserialize<'de> for InputMap<A>where
A: Deserialize<'de> + Actionlike,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl<A: Actionlike> From<HashMap<A, Vec<UserInput>>> for InputMap<A>
impl<A: Actionlike> From<HashMap<A, Vec<UserInput>>> for InputMap<A>
source§fn from(map: HashMap<A, Vec<UserInput>>) -> Self
fn from(map: HashMap<A, Vec<UserInput>>) -> Self
Create InputMap<A>
from HashMap<A, Vec<UserInput>>
§Example
use leafwing_input_manager::input_map::InputMap;
use leafwing_input_manager::user_input::UserInput;
use leafwing_input_manager::Actionlike;
use bevy::input::keyboard::KeyCode;
use bevy::reflect::Reflect;
use bevy::utils::HashMap;
#[derive(Actionlike, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
enum Action {
Run,
Jump,
}
let mut map: HashMap<Action, Vec<UserInput>> = HashMap::default();
map.insert(
Action::Run,
vec![KeyCode::ShiftLeft.into(), KeyCode::ShiftRight.into()],
);
let input_map = InputMap::<Action>::from(map);
source§impl<A: Actionlike> FromIterator<(A, UserInput)> for InputMap<A>
impl<A: Actionlike> FromIterator<(A, UserInput)> for InputMap<A>
source§fn from_iter<T: IntoIterator<Item = (A, UserInput)>>(iter: T) -> Self
fn from_iter<T: IntoIterator<Item = (A, UserInput)>>(iter: T) -> Self
Create InputMap<A>
from iterator with the item type (A, UserInput)
source§impl<A> FromReflect for InputMap<A>
impl<A> FromReflect for InputMap<A>
source§fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
Self
from a reflected value.§fn take_from_reflect(
reflect: Box<dyn Reflect>
) -> Result<Self, Box<dyn Reflect>>
fn take_from_reflect( reflect: Box<dyn Reflect> ) -> Result<Self, Box<dyn Reflect>>
Self
using,
constructing the value using from_reflect
if that fails. Read moresource§impl<A> GetTypeRegistration for InputMap<A>
impl<A> GetTypeRegistration for InputMap<A>
fn get_type_registration() -> TypeRegistration
source§impl<A: PartialEq + Actionlike> PartialEq for InputMap<A>
impl<A: PartialEq + Actionlike> PartialEq for InputMap<A>
source§impl<A> Reflect for InputMap<A>
impl<A> Reflect for InputMap<A>
source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
TypeInfo
] of the type represented by this value. Read moresource§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
.source§fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
source§fn as_reflect(&self) -> &dyn Reflect
fn as_reflect(&self) -> &dyn Reflect
source§fn as_reflect_mut(&mut self) -> &mut dyn Reflect
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
source§fn clone_value(&self) -> Box<dyn Reflect>
fn clone_value(&self) -> Box<dyn Reflect>
Reflect
trait object. Read moresource§fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
source§fn reflect_owned(self: Box<Self>) -> ReflectOwned
fn reflect_owned(self: Box<Self>) -> ReflectOwned
source§fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
§fn serializable(&self) -> Option<Serializable<'_>>
fn serializable(&self) -> Option<Serializable<'_>>
§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
source§impl<A> Struct for InputMap<A>
impl<A> Struct for InputMap<A>
source§fn field(&self, name: &str) -> Option<&dyn Reflect>
fn field(&self, name: &str) -> Option<&dyn Reflect>
name
as a &dyn Reflect
.source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
name
as a
&mut dyn Reflect
.source§fn field_at(&self, index: usize) -> Option<&dyn Reflect>
fn field_at(&self, index: usize) -> Option<&dyn Reflect>
index
as a
&dyn Reflect
.source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
index
as a &mut dyn Reflect
.source§fn name_at(&self, index: usize) -> Option<&str>
fn name_at(&self, index: usize) -> Option<&str>
index
.source§fn iter_fields(&self) -> FieldIter<'_>
fn iter_fields(&self) -> FieldIter<'_>
source§fn clone_dynamic(&self) -> DynamicStruct
fn clone_dynamic(&self) -> DynamicStruct
DynamicStruct
].source§impl<A> TypePath for InputMap<A>
impl<A> TypePath for InputMap<A>
source§fn type_path() -> &'static str
fn type_path() -> &'static str
source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
source§impl<A: Actionlike> VisitAssetDependencies for InputMap<A>
impl<A: Actionlike> VisitAssetDependencies for InputMap<A>
fn visit_dependencies(&self, visit: &mut impl FnMut(UntypedAssetId))
impl<A: Actionlike> Asset for InputMap<A>
impl<A: Eq + Actionlike> Eq for InputMap<A>
impl<A: Actionlike> Resource for InputMap<A>
impl<A: Actionlike> StructuralPartialEq for InputMap<A>
Auto Trait Implementations§
impl<A> RefUnwindSafe for InputMap<A>where
A: RefUnwindSafe,
impl<A> Send for InputMap<A>
impl<A> Sync for InputMap<A>
impl<A> Unpin for InputMap<A>where
A: Unpin,
impl<A> UnwindSafe for InputMap<A>where
A: UnwindSafe,
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
T
[ShaderType
] for self
. When used in [AsBindGroup
]
derives, it is safe to assume that all images in self
exist.§impl<A> AssetContainer for Awhere
A: Asset,
impl<A> AssetContainer for Awhere
A: Asset,
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut Components, storages: &mut Storages, ids: &mut impl FnMut(ComponentId) )
unsafe fn from_components<T, F>(ctx: &mut T, func: &mut F) -> C
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> DynEq for T
impl<T> DynEq for T
§impl<C> DynamicBundle for Cwhere
C: Component,
impl<C> DynamicBundle for Cwhere
C: Component,
fn get_components(self, func: &mut impl FnMut(StorageType, OwningPtr<'_>))
§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path
].§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
TypePath::short_type_path
].§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident
].§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name
].§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
TypePath::module_path
].§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Self
using data from the given [World
].§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
§impl<T> GetPath for Twhere
T: Reflect + ?Sized,
impl<T> GetPath for Twhere
T: Reflect + ?Sized,
§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>
) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p> ) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
path
. Read more§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>
) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p> ) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
path
. Read more