pub struct ActionState<A: ActionLike> { /* private fields */ }Expand description
Sim-side gameplay input: fed from repose events each frame, read by
fixed-step systems each tick. Edges (just_pressed/just_released)
clear at the END of each tick (end_tick,
registered last), so compose-fed events survive until the tick’s
systems run. Frame-scope readers call
clear_edges after consuming.
Implementations§
Source§impl<A: ActionLike> ActionState<A>
impl<A: ActionLike> ActionState<A>
pub fn new(map: ActionMap<A>) -> Self
pub fn map(&self) -> &ActionMap<A>
Sourcepub fn end_tick(&mut self)
pub fn end_tick(&mut self)
Edge rollover for the tick end: edges clear, levels persist.
Frame-scope readers use clear_edges instead.
Sourcepub fn clear_edges(&mut self)
pub fn clear_edges(&mut self)
Clear edges outside the schedule (after frame-scope consumption).
Sourcepub fn set_contexts(&mut self, contexts: &[&str])
pub fn set_contexts(&mut self, contexts: &[&str])
Switch the active context set (phase gating, e.g. menu vs play).
Empty set with contexts defined means only context-free actions fire.
Pending edges drop only when the set actually changes: re-setting
the same contexts every frame (the normal pump pattern) keeps them.
Levels (pressed) always track hardware truthfully.
Sourcepub fn key(&mut self, chord: &KeyChord, down: bool)
pub fn key(&mut self, chord: &KeyChord, down: bool)
Feed a keyboard chord press/release from the runner.
Sourcepub fn mouse(&mut self, button: PointerButton, down: bool)
pub fn mouse(&mut self, button: PointerButton, down: bool)
Feed a mouse button press/release.
Sourcepub fn pad(&mut self, button: GamepadButton, down: bool)
pub fn pad(&mut self, button: GamepadButton, down: bool)
Feed a gamepad button press/release.
Sourcepub fn axis(&mut self, axis: GamepadAxis, value: f32)
pub fn axis(&mut self, axis: GamepadAxis, value: f32)
Feed an axis value; threshold bindings flip on crossing. Re-evaluates every action bound to this axis with OR semantics, so a second binding holding the action keeps it pressed.
Sourcepub fn axis_value(&self, axis: GamepadAxis) -> f32
pub fn axis_value(&self, axis: GamepadAxis) -> f32
Latest raw value fed for an axis (0.0 if never fed).
This is the raw deflection in -1..1 (sticks) or 0..1 (triggers),
with no threshold or deadzone applied. Use ActionState::strength
for the per-action intensity with thresholds applied.
Sourcepub fn strength(&self, action: &A) -> f32
pub fn strength(&self, action: &A) -> f32
Intensity of an action, from 0.0 (inactive) to 1.0 (fully held).
For button bindings (key, mouse, pad) the value is 0 or 1. For
axis bindings it is the stick deflection |value| clamped to
0..1, so the further the stick is pushed past its threshold, the
closer the value is to 1. When several bindings drive one action,
the strongest active binding wins.
Returns 0.0 while the action is gated out by its context or has
been consumed, matching
pressed.
In most cases where you need a direction (twin-stick movement,
menus), use vector instead of combining
strengths by hand.
Sourcepub fn vector(
&self,
neg_x: &A,
pos_x: &A,
neg_y: &A,
pos_y: &A,
deadzone: f32,
) -> (f32, f32)
pub fn vector( &self, neg_x: &A, pos_x: &A, neg_y: &A, pos_y: &A, deadzone: f32, ) -> (f32, f32)
Movement vector from four actions: (x, y) with
x = strength(pos_x) - strength(neg_x) and
y = strength(pos_y) - strength(neg_y).
This is useful for vector input such as a joystick, d-pad, arrows,
or WASD driving movement. The result has a circular deadzone and its
length limited to 1, so diagonal input never moves faster than
axis-aligned input:
- Lengths below
deadzone(range0..1) snap to(0, 0), which keeps a resting stick from drifting the player. Use0.2for a standard stick feel,0.0to disable. - Lengths above
1(opposite pairs can’t exceed this, but two full-strength diagonals can in theory) are normalized back to1.
Note: y follows screen convention (pos_y is down-positive).
For world-up movement, negate y or swap the pair at the call site.
let (x, y) = state.vector(&MoveLeft, &MoveRight, &MoveUp, &MoveDown, 0.2);
player.vel = Vec2::new(x, y) * SPEED;Sourcepub fn pressed(&self, action: &A) -> bool
pub fn pressed(&self, action: &A) -> bool
Held (and live in the active context, not consumed).
Returns true for every tick while any of the action’s bindings is
held down. Actions gated out by set_contexts
or hidden by consume read as released here
even while the hardware is held. The level below keeps tracking the
hardware truthfully, so re-entering the context (or
clear_consumed) reports held again
without a new press.
Sourcepub fn just_pressed(&self, action: &A) -> bool
pub fn just_pressed(&self, action: &A) -> bool
Started this tick (and live in the active context, not consumed).
Returns true only on the tick the action was pressed: the edge is
set by the press event and cleared at the end of the tick by
end_tick, so holding the button does not
re-trigger it. If several ticks run in one frame, only systems in
the first tick observe the edge.
Sourcepub fn just_released(&self, action: &A) -> bool
pub fn just_released(&self, action: &A) -> bool
Released this tick (and live in the active context, not consumed).
Same gating as pressed/just_pressed, so context-gated and
UI-consumed releases never leak to late readers.
Returns true only on the tick the last held binding was released
(see the OR release rule in the module docs). Like just_pressed,
the edge clears at end_tick.
Sourcepub fn consume(&mut self, action: &A) -> bool
pub fn consume(&mut self, action: &A) -> bool
Swallow an action so later readers skip it (UI consumed the click). Returns true while the action is held.
pub fn consume_all(&mut self)
Sourcepub fn mock(&mut self, action: &A, down: bool)
pub fn mock(&mut self, action: &A, down: bool)
Drive an action without hardware (cutscenes, AI, tests).
Sourcepub fn clear_consumed(&mut self)
pub fn clear_consumed(&mut self)
Clear consumption (fresh frame handoff from UI).
Trait Implementations§
Source§impl<A: ActionLike> Component for ActionState<A>
impl<A: ActionLike> Component for ActionState<A>
Source§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
Source§type Mutability = Mutable
type Mutability = Mutable
Component<Mutability = Mutable>,
while immutable components will instead have Component<Mutability = Immutable>. Read moreSource§fn register_required_components(
_requiree: ComponentId,
required_components: &mut RequiredComponentsRegistrator<'_, '_>,
)
fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )
Source§fn clone_behavior() -> ComponentCloneBehavior
fn clone_behavior() -> ComponentCloneBehavior
Source§fn relationship_accessor() -> Option<ComponentRelationshipAccessor<Self>>
fn relationship_accessor() -> Option<ComponentRelationshipAccessor<Self>>
ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read moreSource§fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
EntityMapper. This is used to remap entities in contexts like scenes and entity cloning.
When deriving Component, this is populated by annotating fields containing entities with #[entities] Read moreSource§impl<A: Debug + ActionLike> Debug for ActionState<A>
impl<A: Debug + ActionLike> Debug for ActionState<A>
impl<A: ActionLike> Resource for ActionState<A>
Auto Trait Implementations§
impl<A> Freeze for ActionState<A>
impl<A> RefUnwindSafe for ActionState<A>
impl<A> Send for ActionState<A>
impl<A> Sync for ActionState<A>
impl<A> Unpin for ActionState<A>
impl<A> UnsafeUnpin for ActionState<A>
impl<A> UnwindSafe for ActionState<A>
Blanket Implementations§
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
Source§impl<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>
Source§fn get_component_ids(
components: &Components,
) -> impl Iterator<Item = Option<ComponentId>>
fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>
Source§impl<C> BundleFromComponents for Cwhere
C: Component,
impl<C> BundleFromComponents for Cwhere
C: Component,
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§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>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§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.Source§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.