Skip to main content

Timer

Struct Timer 

Source
pub struct Timer { /* private fields */ }
Expand description

Tracks elapsed time. Enters the finished state once duration is reached.

Note that in order to advance the timer tick MUST be called.

§Timer modes

There are two timer modes (TimerMode):

  • Non repeating timers will stop tracking and stay in the finished state until reset.
  • Repeating timers will only be in the finished state on each tick duration is reached or exceeded, and can still be reset at any given point.

§Pausing timers

You can pause a timer using Timer::pause. Paused timers will not have elapsed time increased.

§Elapsing multiple times a frame

Repeating timers might elapse multiple times per frame if the time is advanced by more than the timer duration. You can check how many times a timer elapsed each tick with Timer::times_finished_this_tick. For non-repeating timers, this will always be 0 or 1.

Implementations§

Source§

impl Timer

Source

pub fn new(duration: Duration, mode: TimerMode) -> Timer

Creates a new timer with a given duration.

See also Timer::from_seconds.

Examples found in repository?
examples/2d/sprite_animation.rs (line 51)
50    fn timer_from_fps(fps: u8) -> Timer {
51        Timer::new(Duration::from_secs_f32(1.0 / (fps as f32)), TimerMode::Once)
52    }
More examples
Hide additional examples
examples/window/custom_cursor_image.rs (line 108)
107    fn timer_from_fps(fps: u8) -> Timer {
108        Timer::new(Duration::from_secs_f32(1.0 / (fps as f32)), TimerMode::Once)
109    }
examples/app/plugin.rs (line 35)
32    fn build(&self, app: &mut App) {
33        let state = PrintMessageState {
34            message: self.message.clone(),
35            timer: Timer::new(self.wait_duration, TimerMode::Repeating),
36        };
37        app.insert_resource(state)
38            .add_systems(Update, print_message_system);
39    }
examples/ui/ui_scaling.rs (line 15)
9fn main() {
10    App::new()
11        .add_plugins(DefaultPlugins)
12        .insert_resource(TargetScale {
13            start_scale: 1.0,
14            target_scale: 1.0,
15            target_time: Timer::new(Duration::from_millis(SCALE_TIME), TimerMode::Once),
16        })
17        .add_systems(Startup, setup)
18        .add_systems(
19            Update,
20            (change_scaling, apply_scaling.after(change_scaling)),
21        )
22        .run();
23}
examples/3d/clustered_decal_maps.rs (line 292)
281fn spawn_decal(
282    mut commands: Commands,
283    app_status: Res<AppStatus>,
284    app_textures: Res<AppTextures>,
285    time: Res<Time>,
286    mut decal_spawn_timer: Local<Option<Timer>>,
287    mut seeded_rng: ResMut<SeededRng>,
288) {
289    // Tick the decal spawn timer. Check to see if we should spawn a new decal,
290    // and bail out if it's not yet time to.
291    let decal_spawn_timer = decal_spawn_timer
292        .get_or_insert_with(|| Timer::new(Duration::from_millis(1000), TimerMode::Repeating));
293    decal_spawn_timer.tick(time.delta());
294    if !decal_spawn_timer.just_finished() {
295        return;
296    }
297
298    // Generate a random position along the plane.
299    let decal_position = vec3(
300        seeded_rng.0.random_range(-PLANE_HALF_SIZE..PLANE_HALF_SIZE),
301        seeded_rng.0.random_range(-PLANE_HALF_SIZE..PLANE_HALF_SIZE),
302        0.0,
303    );
304
305    // Generate a random size for the decal.
306    let decal_size = seeded_rng.0.random_range(DECAL_MIN_SIZE..DECAL_MAX_SIZE);
307
308    // Generate a random rotation for the decal.
309    let theta = seeded_rng.0.random_range(0.0f32..PI);
310
311    // Now spawn the decal.
312    commands.spawn((
313        // Apply the textures.
314        ClusteredDecal {
315            base_color_texture: Some(app_textures.decal_base_color_texture.clone()),
316            normal_map_texture: Some(app_textures.decal_normal_map_texture.clone()),
317            metallic_roughness_texture: Some(
318                app_textures.decal_metallic_roughness_map_texture.clone(),
319            ),
320            emissive_texture: if app_status.emissive_decals {
321                Some(app_textures.decal_emissive_texture.clone())
322            } else {
323                None
324            },
325            ..ClusteredDecal::default()
326        },
327        // Spawn the decal at the right place. Note that the scale is initially
328        // zero; we'll animate it later.
329        Transform::from_translation(decal_position)
330            .with_scale(Vec3::ZERO)
331            .looking_to(Vec3::Z, Vec3::ZERO.with_xy(Vec2::from_angle(theta))),
332        // Create the component that tracks the animation state.
333        ExampleDecal {
334            size: decal_size,
335            state: ExampleDecalState::AnimatingIn(Timer::new(
336                DECAL_ANIMATE_IN_DURATION,
337                TimerMode::Once,
338            )),
339        },
340    ));
341}
342
343/// A system that animates the decals growing as they enter and shrinking as
344/// they leave.
345fn animate_decals(
346    mut commands: Commands,
347    mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348    time: Res<Time>,
349) {
350    for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351        // Update the animation timers, and advance the animation state if the
352        // timer has expired.
353        match example_decal.state {
354            ExampleDecalState::AnimatingIn(ref mut timer) => {
355                timer.tick(time.delta());
356                if timer.just_finished() {
357                    example_decal.state =
358                        ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359                }
360            }
361            ExampleDecalState::Idling(ref mut timer) => {
362                timer.tick(time.delta());
363                if timer.just_finished() {
364                    example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365                        DECAL_ANIMATE_OUT_DURATION,
366                        TimerMode::Once,
367                    ));
368                }
369            }
370            ExampleDecalState::AnimatingOut(ref mut timer) => {
371                timer.tick(time.delta());
372                if timer.just_finished() {
373                    commands.entity(decal_entity).despawn();
374                    continue;
375                }
376            }
377        }
378
379        // Actually animate the decal by adjusting its transform.
380        // All we have to do here is to compute the decal's scale as a fraction
381        // of its full size.
382        let new_decal_scale_factor = match example_decal.state {
383            ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384            ExampleDecalState::Idling(_) => 1.0,
385            ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386        };
387        decal_transform.scale =
388            Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389    }
390}
Source

pub fn from_seconds(duration: f32, mode: TimerMode) -> Timer

Creates a new timer with a given duration in seconds.

§Example
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
Examples found in repository?
examples/stress_tests/many_cubes.rs (line 584)
583    fn default() -> Self {
584        Self(Timer::from_seconds(1.0, TimerMode::Repeating))
585    }
More examples
Hide additional examples
examples/stress_tests/many_lights.rs (line 191)
190    fn default() -> Self {
191        Self(Timer::from_seconds(1.0, TimerMode::Repeating))
192    }
examples/stress_tests/many_sprite_meshes.rs (line 116)
115    fn default() -> Self {
116        Self(Timer::from_seconds(1.0, TimerMode::Repeating))
117    }
examples/stress_tests/many_sprites.rs (line 114)
113    fn default() -> Self {
114        Self(Timer::from_seconds(1.0, TimerMode::Repeating))
115    }
examples/stress_tests/many_text2d.rs (line 102)
101    fn default() -> Self {
102        Self(Timer::from_seconds(1.0, TimerMode::Repeating))
103    }
examples/ecs/message.rs (line 29)
28    fn default() -> Self {
29        DamageTimer(Timer::from_seconds(1.0, TimerMode::Repeating))
30    }
Source

pub fn is_finished(&self) -> bool

Returns true if the timer has reached its duration.

For repeating timers, this method behaves identically to Timer::just_finished.

§Examples
use std::time::Duration;

let mut timer_once = Timer::from_seconds(1.0, TimerMode::Once);
timer_once.tick(Duration::from_secs_f32(1.5));
assert!(timer_once.is_finished());
timer_once.tick(Duration::from_secs_f32(0.5));
assert!(timer_once.is_finished());

let mut timer_repeating = Timer::from_seconds(1.0, TimerMode::Repeating);
timer_repeating.tick(Duration::from_secs_f32(1.1));
assert!(timer_repeating.is_finished());
timer_repeating.tick(Duration::from_secs_f32(0.8));
assert!(!timer_repeating.is_finished());
timer_repeating.tick(Duration::from_secs_f32(0.6));
assert!(timer_repeating.is_finished());
Examples found in repository?
examples/ui/ui_scaling.rs (line 119)
118    fn already_completed(&self) -> bool {
119        self.target_time.is_finished() && !self.target_time.just_finished()
120    }
More examples
Hide additional examples
examples/app/plugin.rs (line 49)
48fn print_message_system(mut state: ResMut<PrintMessageState>, time: Res<Time>) {
49    if state.timer.tick(time.delta()).is_finished() {
50        info!("{}", state.message);
51    }
52}
examples/showcase/game_menu.rs (line 107)
102    fn countdown(
103        mut game_state: ResMut<NextState<GameState>>,
104        time: Res<Time>,
105        mut timer: ResMut<SplashTimer>,
106    ) {
107        if timer.tick(time.delta()).is_finished() {
108            game_state.set(GameState::Menu);
109        }
110    }
111}
112
113mod game {
114    use bevy::{
115        color::palettes::basic::{BLUE, LIME},
116        prelude::*,
117    };
118
119    use super::{DisplayQuality, GameState, Volume, TEXT_COLOR};
120
121    // This plugin will contain the game. In this case, it's just be a screen that will
122    // display the current settings for 5 seconds before returning to the menu
123    pub fn game_plugin(app: &mut App) {
124        app.add_systems(OnEnter(GameState::Game), game_setup)
125            .add_systems(Update, game.run_if(in_state(GameState::Game)));
126    }
127
128    // Tag component used to tag entities added on the game screen
129    #[derive(Component)]
130    struct OnGameScreen;
131
132    #[derive(Resource, Deref, DerefMut)]
133    struct GameTimer(Timer);
134
135    fn game_setup(
136        mut commands: Commands,
137        display_quality: Res<DisplayQuality>,
138        volume: Res<Volume>,
139    ) {
140        commands.spawn((
141            DespawnOnExit(GameState::Game),
142            Node {
143                width: percent(100),
144                height: percent(100),
145                // center children
146                align_items: AlignItems::Center,
147                justify_content: JustifyContent::Center,
148                ..default()
149            },
150            OnGameScreen,
151            children![(
152                Node {
153                    // This will display its children in a column, from top to bottom
154                    flex_direction: FlexDirection::Column,
155                    // `align_items` will align children on the cross axis. Here the main axis is
156                    // vertical (column), so the cross axis is horizontal. This will center the
157                    // children
158                    align_items: AlignItems::Center,
159                    ..default()
160                },
161                BackgroundColor(Color::BLACK),
162                children![
163                    (
164                        Text::new("Will be back to the menu shortly..."),
165                        TextFont {
166                            font_size: FontSize::Px(67.0),
167                            ..default()
168                        },
169                        TextColor(TEXT_COLOR),
170                        Node {
171                            margin: UiRect::all(px(50)),
172                            ..default()
173                        },
174                    ),
175                    (
176                        Text::default(),
177                        Node {
178                            margin: UiRect::all(px(50)),
179                            ..default()
180                        },
181                        children![
182                            (
183                                TextSpan(format!("quality: {:?}", *display_quality)),
184                                TextFont {
185                                    font_size: FontSize::Px(50.0),
186                                    ..default()
187                                },
188                                TextColor(BLUE.into()),
189                            ),
190                            (
191                                TextSpan::new(" - "),
192                                TextFont {
193                                    font_size: FontSize::Px(50.0),
194                                    ..default()
195                                },
196                                TextColor(TEXT_COLOR),
197                            ),
198                            (
199                                TextSpan(format!("volume: {:?}", *volume)),
200                                TextFont {
201                                    font_size: FontSize::Px(50.0),
202                                    ..default()
203                                },
204                                TextColor(LIME.into()),
205                            ),
206                        ]
207                    ),
208                ]
209            )],
210        ));
211        // Spawn a 5 seconds timer to trigger going back to the menu
212        commands.insert_resource(GameTimer(Timer::from_seconds(5.0, TimerMode::Once)));
213    }
214
215    // Tick the timer, and change state when finished
216    fn game(
217        time: Res<Time>,
218        mut game_state: ResMut<NextState<GameState>>,
219        mut timer: ResMut<GameTimer>,
220    ) {
221        if timer.tick(time.delta()).is_finished() {
222            game_state.set(GameState::Menu);
223        }
224    }
examples/ecs/message.rs (line 45)
40fn deal_damage_over_time(
41    time: Res<Time>,
42    mut state: ResMut<DamageTimer>,
43    mut deal_damage_writer: MessageWriter<DealDamage>,
44) {
45    if state.tick(time.delta()).is_finished() {
46        // Messages can be sent with 'write' and constructed just like any other object.
47        deal_damage_writer.write(DealDamage { amount: 10 });
48    }
49}
examples/ecs/state_scoped.rs (line 179)
173fn toggle(
174    time: Res<Time>,
175    mut timer: ResMut<TickTock>,
176    state: Res<State<GameState>>,
177    mut next_state: ResMut<NextState<GameState>>,
178) {
179    if !timer.0.tick(time.delta()).is_finished() {
180        return;
181    }
182    *next_state = match state.get() {
183        GameState::A => NextState::Pending(GameState::B),
184        GameState::B => NextState::Pending(GameState::C(1)),
185        GameState::C(_) => NextState::Pending(GameState::A),
186    }
187}
examples/window/custom_cursor_image.rs (line 120)
115fn execute_animation(time: Res<Time>, mut query: Query<(&mut AnimationConfig, &mut CursorIcon)>) {
116    for (mut config, mut cursor_icon) in &mut query {
117        if let CursorIcon::Custom(CustomCursor::Image(ref mut image)) = *cursor_icon {
118            config.frame_timer.tick(time.delta());
119
120            if config.frame_timer.is_finished()
121                && let Some(atlas) = image.texture_atlas.as_mut()
122            {
123                atlas.index += config.increment;
124
125                if atlas.index > config.last_sprite_index {
126                    atlas.index = config.first_sprite_index;
127                }
128
129                config.frame_timer = AnimationConfig::timer_from_fps(config.fps);
130            }
131        }
132    }
133}
Source

pub fn just_finished(&self) -> bool

Returns true only on the tick the timer reached its duration.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(1.5));
assert!(timer.just_finished());
timer.tick(Duration::from_secs_f32(0.5));
assert!(!timer.just_finished());
Examples found in repository?
examples/ui/ui_scaling.rs (line 119)
118    fn already_completed(&self) -> bool {
119        self.target_time.is_finished() && !self.target_time.just_finished()
120    }
More examples
Hide additional examples
examples/stress_tests/many_sprites.rs (line 122)
119fn print_sprite_count(time: Res<Time>, mut timer: Local<PrintingTimer>, sprites: Query<&Sprite>) {
120    timer.tick(time.delta());
121
122    if timer.just_finished() {
123        info!("Sprites: {}", sprites.iter().count());
124    }
125}
examples/stress_tests/many_lights.rs (line 145)
142fn print_light_count(time: Res<Time>, mut timer: Local<PrintingTimer>, lights: Query<&PointLight>) {
143    timer.0.tick(time.delta());
144
145    if timer.0.just_finished() {
146        info!("Lights: {}", lights.iter().len());
147    }
148}
149
150struct LogVisibleLights;
151
152impl Plugin for LogVisibleLights {
153    fn build(&self, app: &mut App) {
154        let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
155            return;
156        };
157
158        render_app.add_systems(
159            Render,
160            print_visible_light_count.in_set(RenderSystems::Prepare),
161        );
162    }
163}
164
165// System for printing the number of meshes on every tick of the timer
166fn print_visible_light_count(
167    time: Res<Time>,
168    mut timer: Local<PrintingTimer>,
169    visible: Query<&ExtractedPointLight>,
170    global_clusterable_object_meta: Res<GlobalClusterableObjectMeta>,
171) {
172    timer.0.tick(time.delta());
173
174    if timer.0.just_finished() {
175        // Note that it's not generally a safe assumption that the number of
176        // lights equals the number of clusterable objects, since some objects
177        // other than lights are clusterable. However, in this specific example,
178        // the only clusterable objects are lights.
179        info!(
180            "Visible Lights: {}, Rendered Lights: {}",
181            visible.iter().len(),
182            global_clusterable_object_meta.entity_to_index.len()
183        );
184    }
185}
examples/ecs/generic_system.rs (line 68)
66fn print_text_system(time: Res<Time>, mut query: Query<(&mut PrinterTick, &TextToPrint)>) {
67    for (mut timer, text) in &mut query {
68        if timer.tick(time.delta()).just_finished() {
69            info!("{}", text.0);
70        }
71    }
72}
examples/stress_tests/many_sprite_meshes.rs (line 128)
121fn print_sprite_count(
122    time: Res<Time>,
123    mut timer: Local<PrintingTimer>,
124    sprites: Query<&SpriteMesh>,
125) {
126    timer.tick(time.delta());
127
128    if timer.just_finished() {
129        info!("Sprites: {}", sprites.iter().count());
130    }
131}
examples/time/timers.rs (line 50)
48fn print_when_completed(time: Res<Time>, mut query: Query<&mut PrintOnCompletionTimer>) {
49    for mut timer in &mut query {
50        if timer.tick(time.delta()).just_finished() {
51            info!("Entity timer just finished");
52        }
53    }
54}
55
56/// This system controls ticking the timer within the countdown resource and
57/// handling its state.
58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59    countdown.main_timer.tick(time.delta());
60
61    // The API encourages this kind of timer state checking (if you're only checking for one value)
62    // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63    // timer being repeating, however this makes more sense visually.
64    if countdown.percent_trigger.tick(time.delta()).just_finished() {
65        if !countdown.main_timer.is_finished() {
66            // Print the percent complete the main timer is.
67            info!(
68                "Timer is {:0.0}% complete!",
69                countdown.main_timer.fraction() * 100.0
70            );
71        } else {
72            // The timer has finished so we pause the percent output timer
73            countdown.percent_trigger.pause();
74            info!("Paused percent trigger timer");
75        }
76    }
77}
Source

pub fn elapsed(&self) -> Duration

Returns the time elapsed on the timer. Guaranteed to be between 0.0 and duration. Will only equal duration when the timer is finished and non repeating.

See also Stopwatch::elapsed.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed(), Duration::from_secs_f32(0.5));
Source

pub fn elapsed_secs(&self) -> f32

Returns the time elapsed on the timer as an f32. See also Timer::elapsed.

Examples found in repository?
examples/audio/soundtrack.rs (line 108)
101fn fade_in(
102    mut commands: Commands,
103    mut audio_sink: Query<(&mut AudioSink, Entity), With<FadeIn>>,
104    timer: Res<GameStateTimer>,
105) {
106    for (mut audio, entity) in audio_sink.iter_mut() {
107        audio.set_volume(
108            Volume::SILENT.fade_towards(Volume::Linear(1.0), timer.0.elapsed_secs() / FADE_TIME),
109        );
110        if timer.0.elapsed_secs() >= FADE_TIME {
111            audio.set_volume(Volume::Linear(1.0));
112            commands.entity(entity).remove::<FadeIn>();
113        }
114    }
115}
116
117// Fades out the audio of entities that has the FadeOut component. Despawns the entities once audio
118// volume reaches zero.
119fn fade_out(
120    mut commands: Commands,
121    mut audio_sink: Query<(&mut AudioSink, Entity), With<FadeOut>>,
122    timer: Res<GameStateTimer>,
123) {
124    for (mut audio, entity) in audio_sink.iter_mut() {
125        audio.set_volume(
126            Volume::Linear(1.0).fade_towards(Volume::SILENT, timer.0.elapsed_secs() / FADE_TIME),
127        );
128        if timer.0.elapsed_secs() >= FADE_TIME {
129            commands.entity(entity).despawn();
130        }
131    }
132}
More examples
Hide additional examples
examples/usage/debug_frustum_culling.rs (line 285)
266fn move_shapes(
267    time: Res<Time>,
268    mut timer: Local<Timer>,
269    mut ring_query: Query<&mut Transform, (With<ShapeRing>, Without<MyShape>)>,
270    mut shape_query: Query<(&mut Transform, Has<WallShape>), (With<MyShape>, Without<ShapeRing>)>,
271) -> Result {
272    // Initialize the wall shape's movement timer on the first run.
273    if timer.duration().is_zero() {
274        *timer = Timer::from_seconds(WALL_SHAPE_TIMER_DURATION_SECS, TimerMode::Repeating);
275    }
276    timer.tick(time.delta());
277    let dt = time.delta_secs();
278
279    // Rotate the shapes themselves on their own axis
280    for (mut transform, has_wall_shape) in &mut shape_query {
281        transform.rotate_y(dt / 2.);
282        if has_wall_shape {
283            // the wall shape moves up for 4 seconds and then down for 4 seconds.
284            // it oscillates between y = 1.5 and 15.0
285            transform.translation.y = if timer.elapsed_secs() < WALL_SHAPE_TIMER_DURATION_SECS / 2.0
286            {
287                1.5 + 15.0 * timer.elapsed_secs() / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
288            } else {
289                1.5 + 15.0 * (WALL_SHAPE_TIMER_DURATION_SECS - timer.elapsed_secs())
290                    / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
291            }
292        }
293    }
294
295    // Rotate the ring
296    let transform = &mut ring_query.single_mut()?;
297    transform.rotate_y(dt / 3.);
298
299    Ok(())
300}
Source

pub fn elapsed_secs_f64(&self) -> f64

Returns the time elapsed on the timer as an f64. See also Timer::elapsed.

Source

pub fn set_elapsed(&mut self, time: Duration)

Sets the elapsed time of the timer without any other considerations.

See also Stopwatch::set.

§
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.set_elapsed(Duration::from_secs(2));
assert_eq!(timer.elapsed(), Duration::from_secs(2));
// the timer is not finished even if the elapsed time is greater than the duration.
assert!(!timer.is_finished());
Examples found in repository?
examples/stress_tests/many_animated_sprites.rs (line 78)
47fn setup(
48    mut commands: Commands,
49    assets: Res<AssetServer>,
50    mut texture_atlases: ResMut<Assets<TextureAtlasLayout>>,
51) {
52    warn!(include_str!("warning_string.txt"));
53
54    let mut rng = rand::rng();
55
56    let tile_size = Vec2::splat(64.0);
57    let map_size = Vec2::splat(320.0);
58
59    let half_x = (map_size.x / 2.0) as i32;
60    let half_y = (map_size.y / 2.0) as i32;
61
62    let texture_handle = assets.load("textures/rpg/chars/gabe/gabe-idle-run.png");
63    let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None);
64    let texture_atlas_handle = texture_atlases.add(texture_atlas);
65
66    // Spawns the camera
67
68    commands.spawn(Camera2d);
69
70    // Builds and spawns the sprites
71    for y in -half_y..half_y {
72        for x in -half_x..half_x {
73            let position = Vec2::new(x as f32, y as f32);
74            let translation = (position * tile_size).extend(rng.random::<f32>());
75            let rotation = Quat::from_rotation_z(rng.random::<f32>());
76            let scale = Vec3::splat(rng.random::<f32>() * 2.0);
77            let mut timer = Timer::from_seconds(0.1, TimerMode::Repeating);
78            timer.set_elapsed(Duration::from_secs_f32(rng.random::<f32>()));
79
80            commands.spawn((
81                Sprite {
82                    image: texture_handle.clone(),
83                    texture_atlas: Some(TextureAtlas::from(texture_atlas_handle.clone())),
84                    custom_size: Some(tile_size),
85                    ..default()
86                },
87                Transform {
88                    translation,
89                    rotation,
90                    scale,
91                },
92                AnimationTimer(timer),
93            ));
94        }
95    }
96}
More examples
Hide additional examples
examples/stress_tests/many_animated_sprite_meshes.rs (line 80)
49fn setup(
50    mut commands: Commands,
51    assets: Res<AssetServer>,
52    mut texture_atlases: ResMut<Assets<TextureAtlasLayout>>,
53) {
54    warn!(include_str!("warning_string.txt"));
55
56    let mut rng = rand::rng();
57
58    let tile_size = Vec2::splat(64.0);
59    let map_size = Vec2::splat(320.0);
60
61    let half_x = (map_size.x / 2.0) as i32;
62    let half_y = (map_size.y / 2.0) as i32;
63
64    let texture_handle = assets.load("textures/rpg/chars/gabe/gabe-idle-run.png");
65    let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None);
66    let texture_atlas_handle = texture_atlases.add(texture_atlas);
67
68    // Spawns the camera
69
70    commands.spawn(Camera2d);
71
72    // Builds and spawns the sprites
73    for y in -half_y..half_y {
74        for x in -half_x..half_x {
75            let position = Vec2::new(x as f32, y as f32);
76            let translation = (position * tile_size).extend(rng.random::<f32>());
77            let rotation = Quat::from_rotation_z(rng.random::<f32>());
78            let scale = Vec3::splat(rng.random::<f32>() * 2.0);
79            let mut timer = Timer::from_seconds(0.1, TimerMode::Repeating);
80            timer.set_elapsed(Duration::from_secs_f32(rng.random::<f32>()));
81
82            commands.spawn((
83                SpriteMesh {
84                    image: texture_handle.clone(),
85                    texture_atlas: Some(TextureAtlas::from(texture_atlas_handle.clone())),
86                    custom_size: Some(tile_size),
87                    ..default()
88                },
89                Transform {
90                    translation,
91                    rotation,
92                    scale,
93                },
94                AnimationTimer(timer),
95            ));
96        }
97    }
98}
Source

pub fn duration(&self) -> Duration

Returns the duration of the timer.

§Examples
use std::time::Duration;
let timer = Timer::new(Duration::from_secs(1), TimerMode::Once);
assert_eq!(timer.duration(), Duration::from_secs(1));
Examples found in repository?
examples/shader/array_texture.rs (line 77)
75fn update_mesh_tags(time: Res<Time>, mut query: Query<&mut MeshTag>, mut timer: Local<Timer>) {
76    // Initialize the timer on the first run.
77    if timer.duration().is_zero() {
78        *timer = Timer::from_seconds(1.5, TimerMode::Repeating);
79    }
80
81    timer.tick(time.delta());
82    if timer.just_finished() {
83        for mut tag in query.iter_mut() {
84            // Cycle through the texture layers to demonstrate that we can
85            // select different layers of the array texture at runtime.
86            tag.0 = (tag.0 + 1) % TEXTURE_COUNT;
87        }
88    }
89}
More examples
Hide additional examples
examples/usage/debug_frustum_culling.rs (line 273)
266fn move_shapes(
267    time: Res<Time>,
268    mut timer: Local<Timer>,
269    mut ring_query: Query<&mut Transform, (With<ShapeRing>, Without<MyShape>)>,
270    mut shape_query: Query<(&mut Transform, Has<WallShape>), (With<MyShape>, Without<ShapeRing>)>,
271) -> Result {
272    // Initialize the wall shape's movement timer on the first run.
273    if timer.duration().is_zero() {
274        *timer = Timer::from_seconds(WALL_SHAPE_TIMER_DURATION_SECS, TimerMode::Repeating);
275    }
276    timer.tick(time.delta());
277    let dt = time.delta_secs();
278
279    // Rotate the shapes themselves on their own axis
280    for (mut transform, has_wall_shape) in &mut shape_query {
281        transform.rotate_y(dt / 2.);
282        if has_wall_shape {
283            // the wall shape moves up for 4 seconds and then down for 4 seconds.
284            // it oscillates between y = 1.5 and 15.0
285            transform.translation.y = if timer.elapsed_secs() < WALL_SHAPE_TIMER_DURATION_SECS / 2.0
286            {
287                1.5 + 15.0 * timer.elapsed_secs() / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
288            } else {
289                1.5 + 15.0 * (WALL_SHAPE_TIMER_DURATION_SECS - timer.elapsed_secs())
290                    / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
291            }
292        }
293    }
294
295    // Rotate the ring
296    let transform = &mut ring_query.single_mut()?;
297    transform.rotate_y(dt / 3.);
298
299    Ok(())
300}
Source

pub fn set_duration(&mut self, duration: Duration)

Sets the duration of the timer.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.set_duration(Duration::from_secs(1));
assert_eq!(timer.duration(), Duration::from_secs(1));
Source

pub fn finish(&mut self)

Finishes the timer.

§Examples
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.finish();
assert!(timer.is_finished());
Source

pub fn almost_finish(&mut self)

Almost finishes the timer leaving 1 ns of remaining time. This can be useful when needing an immediate action without having to wait for the set duration of the timer in the first tick.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.almost_finish();
assert!(!timer.is_finished());
assert_eq!(timer.remaining(), Duration::from_nanos(1));
Source

pub fn mode(&self) -> TimerMode

Returns the mode of the timer.

§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
assert_eq!(timer.mode(), TimerMode::Repeating);
Source

pub fn set_mode(&mut self, mode: TimerMode)

Sets the mode of the timer.

§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.set_mode(TimerMode::Once);
assert_eq!(timer.mode(), TimerMode::Once);
Source

pub fn tick(&mut self, delta: Duration) -> &Timer

Advance the timer by delta seconds. Non repeating timer will clamp at duration. Repeating timer will wrap around. Will not affect paused timers.

See also Stopwatch::tick.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
let mut repeating = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.tick(Duration::from_secs_f32(1.5));
repeating.tick(Duration::from_secs_f32(1.5));
assert_eq!(timer.elapsed_secs(), 1.0);
assert_eq!(repeating.elapsed_secs(), 0.5);
Examples found in repository?
examples/ui/ui_scaling.rs (line 114)
113    fn tick(&mut self, delta: Duration) -> &Self {
114        self.target_time.tick(delta);
115        self
116    }
More examples
Hide additional examples
examples/app/plugin.rs (line 49)
48fn print_message_system(mut state: ResMut<PrintMessageState>, time: Res<Time>) {
49    if state.timer.tick(time.delta()).is_finished() {
50        info!("{}", state.message);
51    }
52}
examples/stress_tests/many_sprites.rs (line 120)
119fn print_sprite_count(time: Res<Time>, mut timer: Local<PrintingTimer>, sprites: Query<&Sprite>) {
120    timer.tick(time.delta());
121
122    if timer.just_finished() {
123        info!("Sprites: {}", sprites.iter().count());
124    }
125}
examples/stress_tests/many_lights.rs (line 143)
142fn print_light_count(time: Res<Time>, mut timer: Local<PrintingTimer>, lights: Query<&PointLight>) {
143    timer.0.tick(time.delta());
144
145    if timer.0.just_finished() {
146        info!("Lights: {}", lights.iter().len());
147    }
148}
149
150struct LogVisibleLights;
151
152impl Plugin for LogVisibleLights {
153    fn build(&self, app: &mut App) {
154        let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
155            return;
156        };
157
158        render_app.add_systems(
159            Render,
160            print_visible_light_count.in_set(RenderSystems::Prepare),
161        );
162    }
163}
164
165// System for printing the number of meshes on every tick of the timer
166fn print_visible_light_count(
167    time: Res<Time>,
168    mut timer: Local<PrintingTimer>,
169    visible: Query<&ExtractedPointLight>,
170    global_clusterable_object_meta: Res<GlobalClusterableObjectMeta>,
171) {
172    timer.0.tick(time.delta());
173
174    if timer.0.just_finished() {
175        // Note that it's not generally a safe assumption that the number of
176        // lights equals the number of clusterable objects, since some objects
177        // other than lights are clusterable. However, in this specific example,
178        // the only clusterable objects are lights.
179        info!(
180            "Visible Lights: {}, Rendered Lights: {}",
181            visible.iter().len(),
182            global_clusterable_object_meta.entity_to_index.len()
183        );
184    }
185}
examples/ecs/generic_system.rs (line 68)
66fn print_text_system(time: Res<Time>, mut query: Query<(&mut PrinterTick, &TextToPrint)>) {
67    for (mut timer, text) in &mut query {
68        if timer.tick(time.delta()).just_finished() {
69            info!("{}", text.0);
70        }
71    }
72}
examples/stress_tests/many_sprite_meshes.rs (line 126)
121fn print_sprite_count(
122    time: Res<Time>,
123    mut timer: Local<PrintingTimer>,
124    sprites: Query<&SpriteMesh>,
125) {
126    timer.tick(time.delta());
127
128    if timer.just_finished() {
129        info!("Sprites: {}", sprites.iter().count());
130    }
131}
Source

pub fn pause(&mut self)

Pauses the Timer. Disables the ticking of the timer.

See also Stopwatch::pause.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.pause();
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed_secs(), 0.0);
Examples found in repository?
examples/time/timers.rs (line 73)
58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59    countdown.main_timer.tick(time.delta());
60
61    // The API encourages this kind of timer state checking (if you're only checking for one value)
62    // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63    // timer being repeating, however this makes more sense visually.
64    if countdown.percent_trigger.tick(time.delta()).just_finished() {
65        if !countdown.main_timer.is_finished() {
66            // Print the percent complete the main timer is.
67            info!(
68                "Timer is {:0.0}% complete!",
69                countdown.main_timer.fraction() * 100.0
70            );
71        } else {
72            // The timer has finished so we pause the percent output timer
73            countdown.percent_trigger.pause();
74            info!("Paused percent trigger timer");
75        }
76    }
77}
Source

pub fn unpause(&mut self)

Unpauses the Timer. Resumes the ticking of the timer.

See also Stopwatch::unpause().

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.pause();
timer.tick(Duration::from_secs_f32(0.5));
timer.unpause();
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed_secs(), 0.5);
Source

pub fn is_paused(&self) -> bool

Returns true if the timer is paused.

See also Stopwatch::is_paused.

§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
assert!(!timer.is_paused());
timer.pause();
assert!(timer.is_paused());
timer.unpause();
assert!(!timer.is_paused());
Source

pub fn reset(&mut self)

Resets the timer. The reset doesn’t affect the paused state of the timer.

See also Stopwatch::reset.

Examples

use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(1.5));
timer.reset();
assert!(!timer.is_finished());
assert!(!timer.just_finished());
assert_eq!(timer.elapsed_secs(), 0.0);
Examples found in repository?
examples/ui/ui_scaling.rs (line 104)
101    fn set_scale(&mut self, scale: f32) {
102        self.start_scale = self.current_scale();
103        self.target_scale = scale;
104        self.target_time.reset();
105    }
More examples
Hide additional examples
examples/usage/cooldown.rs (line 146)
129fn activate_ability(
130    mut commands: Commands,
131    mut interaction_query: Query<
132        (
133            Entity,
134            &Interaction,
135            &mut Cooldown,
136            &Name,
137            Option<&ActiveCooldown>,
138        ),
139        (Changed<Interaction>, With<Button>),
140    >,
141    mut text: Query<&mut Text>,
142) -> Result {
143    for (entity, interaction, mut cooldown, name, on_cooldown) in &mut interaction_query {
144        if *interaction == Interaction::Pressed {
145            if on_cooldown.is_none() {
146                cooldown.0.reset();
147                commands.entity(entity).insert(ActiveCooldown);
148                **text.single_mut()? = format!("You ate {name}");
149            } else {
150                **text.single_mut()? = format!(
151                    "You can eat {name} again in {} seconds.",
152                    cooldown.0.remaining_secs().ceil()
153                );
154            }
155        }
156    }
157
158    Ok(())
159}
examples/showcase/alien_cake_addict.rs (line 242)
200fn move_player(
201    mut commands: Commands,
202    keyboard_input: Res<ButtonInput<KeyCode>>,
203    mut game: ResMut<Game>,
204    mut transforms: Query<&mut Transform>,
205    time: Res<Time>,
206) {
207    if game.player.move_cooldown.tick(time.delta()).is_finished() {
208        let mut moved = false;
209        let mut rotation = 0.0;
210
211        if keyboard_input.pressed(KeyCode::ArrowUp) {
212            if game.player.i < BOARD_SIZE_I - 1 {
213                game.player.i += 1;
214            }
215            rotation = -PI / 2.;
216            moved = true;
217        }
218        if keyboard_input.pressed(KeyCode::ArrowDown) {
219            if game.player.i > 0 {
220                game.player.i -= 1;
221            }
222            rotation = PI / 2.;
223            moved = true;
224        }
225        if keyboard_input.pressed(KeyCode::ArrowRight) {
226            if game.player.j < BOARD_SIZE_J - 1 {
227                game.player.j += 1;
228            }
229            rotation = PI;
230            moved = true;
231        }
232        if keyboard_input.pressed(KeyCode::ArrowLeft) {
233            if game.player.j > 0 {
234                game.player.j -= 1;
235            }
236            rotation = 0.0;
237            moved = true;
238        }
239
240        // move on the board
241        if moved {
242            game.player.move_cooldown.reset();
243            *transforms.get_mut(game.player.entity.unwrap()).unwrap() = Transform {
244                translation: Vec3::new(
245                    game.player.i as f32,
246                    game.board[game.player.j][game.player.i].height,
247                    game.player.j as f32,
248                ),
249                rotation: Quat::from_rotation_y(rotation),
250                ..default()
251            };
252        }
253    }
254
255    // eat the cake!
256    if let Some(entity) = game.bonus.entity
257        && game.player.i == game.bonus.i
258        && game.player.j == game.bonus.j
259    {
260        game.score += 2;
261        game.cake_eaten += 1;
262        commands.entity(entity).despawn();
263        game.bonus.entity = None;
264    }
265}
Source

pub fn fraction(&self) -> f32

Returns the fraction of the timer elapsed time (goes from 0.0 to 1.0).

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.fraction(), 0.25);
Examples found in repository?
examples/ui/ui_scaling.rs (line 108)
107    fn current_scale(&self) -> f32 {
108        let completion = self.target_time.fraction();
109        let t = ease_in_expo(completion);
110        self.start_scale.lerp(self.target_scale, t)
111    }
More examples
Hide additional examples
examples/animation/animated_mesh_events.rs (line 206)
194fn simulate_particles(
195    mut commands: Commands,
196    mut query: Query<(Entity, &mut Transform, &mut Particle)>,
197    time: Res<Time>,
198) {
199    for (entity, mut transform, mut particle) in &mut query {
200        if particle.lifetime_timer.tick(time.delta()).just_finished() {
201            commands.entity(entity).despawn();
202            return;
203        }
204
205        transform.translation += particle.velocity * time.delta_secs();
206        transform.scale = Vec3::splat(particle.size.lerp(0.0, particle.lifetime_timer.fraction()));
207        particle
208            .velocity
209            .smooth_nudge(&Vec3::ZERO, 4.0, time.delta_secs());
210    }
211}
examples/gltf/gltf_extension_animation_graph.rs (line 295)
283fn simulate_particles(
284    mut commands: Commands,
285    mut query: Query<(Entity, &mut Transform, &mut Particle)>,
286    time: Res<Time>,
287) {
288    for (entity, mut transform, mut particle) in &mut query {
289        if particle.lifetime_timer.tick(time.delta()).just_finished() {
290            commands.entity(entity).despawn();
291            return;
292        }
293
294        transform.translation += particle.velocity * time.delta_secs();
295        transform.scale = Vec3::splat(particle.size.lerp(0.0, particle.lifetime_timer.fraction()));
296        particle
297            .velocity
298            .smooth_nudge(&Vec3::ZERO, 4.0, time.delta_secs());
299    }
300}
examples/usage/cooldown.rs (line 174)
161fn animate_cooldowns(
162    time: Res<Time>,
163    mut commands: Commands,
164    buttons: Query<(Entity, &mut Cooldown, &Children), With<ActiveCooldown>>,
165    mut nodes: Query<&mut Node>,
166) -> Result {
167    for (entity, mut timer, children) in buttons {
168        timer.0.tick(time.delta());
169        let cooldown = children.first().ok_or("No child")?;
170        if timer.0.just_finished() {
171            commands.entity(entity).remove::<ActiveCooldown>();
172            nodes.get_mut(*cooldown)?.height = percent(0);
173        } else {
174            nodes.get_mut(*cooldown)?.height = percent((1. - timer.0.fraction()) * 100.);
175        }
176    }
177
178    Ok(())
179}
examples/time/timers.rs (line 69)
58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59    countdown.main_timer.tick(time.delta());
60
61    // The API encourages this kind of timer state checking (if you're only checking for one value)
62    // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63    // timer being repeating, however this makes more sense visually.
64    if countdown.percent_trigger.tick(time.delta()).just_finished() {
65        if !countdown.main_timer.is_finished() {
66            // Print the percent complete the main timer is.
67            info!(
68                "Timer is {:0.0}% complete!",
69                countdown.main_timer.fraction() * 100.0
70            );
71        } else {
72            // The timer has finished so we pause the percent output timer
73            countdown.percent_trigger.pause();
74            info!("Paused percent trigger timer");
75        }
76    }
77}
examples/3d/clustered_decal_maps.rs (line 383)
345fn animate_decals(
346    mut commands: Commands,
347    mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348    time: Res<Time>,
349) {
350    for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351        // Update the animation timers, and advance the animation state if the
352        // timer has expired.
353        match example_decal.state {
354            ExampleDecalState::AnimatingIn(ref mut timer) => {
355                timer.tick(time.delta());
356                if timer.just_finished() {
357                    example_decal.state =
358                        ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359                }
360            }
361            ExampleDecalState::Idling(ref mut timer) => {
362                timer.tick(time.delta());
363                if timer.just_finished() {
364                    example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365                        DECAL_ANIMATE_OUT_DURATION,
366                        TimerMode::Once,
367                    ));
368                }
369            }
370            ExampleDecalState::AnimatingOut(ref mut timer) => {
371                timer.tick(time.delta());
372                if timer.just_finished() {
373                    commands.entity(decal_entity).despawn();
374                    continue;
375                }
376            }
377        }
378
379        // Actually animate the decal by adjusting its transform.
380        // All we have to do here is to compute the decal's scale as a fraction
381        // of its full size.
382        let new_decal_scale_factor = match example_decal.state {
383            ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384            ExampleDecalState::Idling(_) => 1.0,
385            ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386        };
387        decal_transform.scale =
388            Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389    }
390}
Source

pub fn fraction_remaining(&self) -> f32

Returns the fraction of the timer remaining time (goes from 1.0 to 0.0).

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.fraction_remaining(), 0.75);
Examples found in repository?
examples/3d/clustered_decal_maps.rs (line 385)
345fn animate_decals(
346    mut commands: Commands,
347    mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348    time: Res<Time>,
349) {
350    for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351        // Update the animation timers, and advance the animation state if the
352        // timer has expired.
353        match example_decal.state {
354            ExampleDecalState::AnimatingIn(ref mut timer) => {
355                timer.tick(time.delta());
356                if timer.just_finished() {
357                    example_decal.state =
358                        ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359                }
360            }
361            ExampleDecalState::Idling(ref mut timer) => {
362                timer.tick(time.delta());
363                if timer.just_finished() {
364                    example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365                        DECAL_ANIMATE_OUT_DURATION,
366                        TimerMode::Once,
367                    ));
368                }
369            }
370            ExampleDecalState::AnimatingOut(ref mut timer) => {
371                timer.tick(time.delta());
372                if timer.just_finished() {
373                    commands.entity(decal_entity).despawn();
374                    continue;
375                }
376            }
377        }
378
379        // Actually animate the decal by adjusting its transform.
380        // All we have to do here is to compute the decal's scale as a fraction
381        // of its full size.
382        let new_decal_scale_factor = match example_decal.state {
383            ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384            ExampleDecalState::Idling(_) => 1.0,
385            ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386        };
387        decal_transform.scale =
388            Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389    }
390}
Source

pub fn remaining_secs(&self) -> f32

Returns the remaining time in seconds

§Examples
use std::cmp::Ordering;
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
let result = timer.remaining_secs().total_cmp(&1.5);
assert_eq!(Ordering::Equal, result);
Examples found in repository?
examples/usage/cooldown.rs (line 152)
129fn activate_ability(
130    mut commands: Commands,
131    mut interaction_query: Query<
132        (
133            Entity,
134            &Interaction,
135            &mut Cooldown,
136            &Name,
137            Option<&ActiveCooldown>,
138        ),
139        (Changed<Interaction>, With<Button>),
140    >,
141    mut text: Query<&mut Text>,
142) -> Result {
143    for (entity, interaction, mut cooldown, name, on_cooldown) in &mut interaction_query {
144        if *interaction == Interaction::Pressed {
145            if on_cooldown.is_none() {
146                cooldown.0.reset();
147                commands.entity(entity).insert(ActiveCooldown);
148                **text.single_mut()? = format!("You ate {name}");
149            } else {
150                **text.single_mut()? = format!(
151                    "You can eat {name} again in {} seconds.",
152                    cooldown.0.remaining_secs().ceil()
153                );
154            }
155        }
156    }
157
158    Ok(())
159}
Source

pub fn remaining(&self) -> Duration

Returns the remaining time using Duration

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.remaining(), Duration::from_secs_f32(1.5));
Source

pub fn times_finished_this_tick(&self) -> u32

Returns the number of times a repeating timer finished during the last tick call.

For non repeating-timers, this method will only ever return 0 or 1.

§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.tick(Duration::from_secs_f32(6.0));
assert_eq!(timer.times_finished_this_tick(), 6);
timer.tick(Duration::from_secs_f32(2.0));
assert_eq!(timer.times_finished_this_tick(), 2);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.times_finished_this_tick(), 0);

Trait Implementations§

Source§

impl Clone for Timer

Source§

fn clone(&self) -> Timer

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Timer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for Timer

Source§

fn default() -> Timer

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Timer

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<Timer, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for Timer

Source§

impl FromArg for Timer

Source§

type This<'from_arg> = Timer

The type to convert into. Read more
Source§

fn from_arg(arg: Arg<'_>) -> Result<<Timer as FromArg>::This<'_>, ArgError>

Creates an item from an argument. Read more
Source§

impl FromReflect for Timer

Source§

fn from_reflect(reflect: &(dyn PartialReflect + 'static)) -> Option<Timer>

Constructs a concrete instance of Self from a reflected value.
Source§

fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>

Attempts to downcast the given value to Self using, constructing the value using from_reflect if that fails. Read more
Source§

impl GetOwnership for Timer

Source§

fn ownership() -> Ownership

Returns the ownership of Self.
Source§

impl GetTypeRegistration for Timer

Source§

fn get_type_registration() -> TypeRegistration

Returns the default TypeRegistration for this type.
Source§

fn register_type_dependencies(registry: &mut TypeRegistry)

Registers other types needed by this type. Read more
Source§

impl IntoReturn for Timer

Source§

fn into_return<'into_return>(self) -> Return<'into_return>
where Timer: 'into_return,

Converts Self into a Return value.
Source§

impl PartialEq for Timer

Source§

fn eq(&self, other: &Timer) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialReflect for Timer

Source§

fn get_represented_type_info(&self) -> Option<&'static TypeInfo>

Returns the TypeInfo of the type represented by this value. Read more
Source§

fn try_apply( &mut self, value: &(dyn PartialReflect + 'static), ) -> Result<(), ApplyError>

Tries to apply a reflected value to this value. Read more
Source§

fn reflect_kind(&self) -> ReflectKind

Returns a zero-sized enumeration of “kinds” of type. Read more
Source§

fn reflect_ref(&self) -> ReflectRef<'_>

Returns an immutable enumeration of “kinds” of type. Read more
Source§

fn reflect_mut(&mut self) -> ReflectMut<'_>

Returns a mutable enumeration of “kinds” of type. Read more
Source§

fn reflect_owned(self: Box<Timer>) -> ReflectOwned

Returns an owned enumeration of “kinds” of type. Read more
Source§

fn try_into_reflect( self: Box<Timer>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>

Attempts to cast this type to a boxed, fully-reflected value.
Source§

fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>

Attempts to cast this type to a fully-reflected value.
Source§

fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>

Attempts to cast this type to a mutable, fully-reflected value.
Source§

fn into_partial_reflect(self: Box<Timer>) -> Box<dyn PartialReflect>

Casts this type to a boxed, reflected value. Read more
Source§

fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)

Casts this type to a reflected value. Read more
Source§

fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)

Casts this type to a mutable, reflected value. Read more
Source§

fn reflect_partial_eq( &self, value: &(dyn PartialReflect + 'static), ) -> Option<bool>

Returns a “partial equality” comparison result. Read more
Source§

fn reflect_partial_cmp( &self, value: &(dyn PartialReflect + 'static), ) -> Option<Ordering>

Returns a “partial comparison” result. Read more
Source§

fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>

Attempts to clone Self using reflection. Read more
Source§

fn apply(&mut self, value: &(dyn PartialReflect + 'static))

Applies a reflected value to this value. Read more
Source§

fn to_dynamic(&self) -> Box<dyn PartialReflect>

Converts this reflected value into its dynamic representation based on its kind. Read more
Source§

fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
where T: 'static, Self: Sized + TypePath,

For a type implementing PartialReflect, combines reflect_clone and take in a useful fashion, automatically constructing an appropriate ReflectCloneError if the downcast fails.
Source§

fn reflect_hash(&self) -> Option<u64>

Returns a hash of the value (which includes the type). Read more
Source§

fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Debug formatter for the value. Read more
Source§

fn is_dynamic(&self) -> bool

Indicates whether or not this type is a dynamic type. Read more
Source§

impl Reflect for Timer

Source§

fn into_any(self: Box<Timer>) -> Box<dyn Any>

Returns the value as a Box<dyn Any>. Read more
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Returns the value as a &dyn Any. Read more
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Returns the value as a &mut dyn Any. Read more
Source§

fn into_reflect(self: Box<Timer>) -> Box<dyn Reflect>

Casts this type to a boxed, fully-reflected value.
Source§

fn as_reflect(&self) -> &(dyn Reflect + 'static)

Casts this type to a fully-reflected value.
Source§

fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)

Casts this type to a mutable, fully-reflected value.
Source§

fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>

Performs a type-checked assignment of a reflected value to this value. Read more
Source§

impl Serialize for Timer

Source§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Struct for Timer

Source§

fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>

Gets a reference to the value of the field named name as a &dyn PartialReflect.
Source§

fn field_mut( &mut self, name: &str, ) -> Option<&mut (dyn PartialReflect + 'static)>

Gets a mutable reference to the value of the field named name as a &mut dyn PartialReflect.
Source§

fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>

Gets a reference to the value of the field with index index as a &dyn PartialReflect.
Source§

fn field_at_mut( &mut self, index: usize, ) -> Option<&mut (dyn PartialReflect + 'static)>

Gets a mutable reference to the value of the field with index index as a &mut dyn PartialReflect.
Source§

fn name_at(&self, index: usize) -> Option<&str>

Gets the name of the field with index index.
Source§

fn index_of_name(&self, name: &str) -> Option<usize>

Gets the index of the field with the given name.
Source§

fn field_len(&self) -> usize

Returns the number of fields in the struct.
Source§

fn iter_fields(&self) -> FieldIter<'_>

Returns an iterator over the values of the reflectable fields for this struct.
Source§

fn to_dynamic_struct(&self) -> DynamicStruct

Creates a new DynamicStruct from this struct.
Source§

fn get_represented_struct_info(&self) -> Option<&'static StructInfo>

Will return None if TypeInfo is not available.
Source§

impl StructuralPartialEq for Timer

Source§

impl TypePath for Timer

Source§

fn type_path() -> &'static str

Returns the fully qualified path of the underlying type. Read more
Source§

fn short_type_path() -> &'static str

Returns a short, pretty-print enabled path to the type. Read more
Source§

fn type_ident() -> Option<&'static str>

Returns the name of the type, or None if it is anonymous. Read more
Source§

fn crate_name() -> Option<&'static str>

Returns the name of the crate the type is in, or None if it is anonymous. Read more
Source§

fn module_path() -> Option<&'static str>

Returns the path to the module the type is in, or None if it is anonymous. Read more
Source§

impl Typed for Timer

Source§

fn type_info() -> &'static TypeInfo

Returns the compile-time info for the underlying type.

Auto Trait Implementations§

§

impl Freeze for Timer

§

impl RefUnwindSafe for Timer

§

impl Send for Timer

§

impl Sync for Timer

§

impl Unpin for Timer

§

impl UnsafeUnpin for Timer

§

impl UnwindSafe for Timer

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Brush for T
where T: Clone + PartialEq + Default + Debug,

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &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)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> DynEq for T
where T: Any + Eq,

Source§

fn dyn_eq(&self, other: &(dyn DynEq + 'static)) -> bool

This method tests for self and other values to be equal. Read more
Source§

impl<T> DynamicTypePath for T
where T: TypePath,

Source§

impl<T> DynamicTyped for T
where T: Typed,

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> FromTemplate for T
where T: Clone + Default + Unpin,

Source§

type Template = T

The Template for this type.
Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<S> GetField for S
where S: Struct,

Source§

fn get_field<T>(&self, name: &str) -> Option<&T>
where T: Reflect,

Gets a reference to the value of the field named name, downcast to T.
Source§

fn get_field_mut<T>(&mut self, name: &str) -> Option<&mut T>
where T: Reflect,

Gets a mutable reference to the value of the field named name, downcast to T.
Source§

impl<T> GetPath for T
where T: Reflect + ?Sized,

Source§

fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>

Returns a reference to the value specified by path. Read more
Source§

fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>

Returns a mutable reference to the value specified by path. Read more
Source§

fn path<'p, T>( &self, path: impl ReflectPath<'p>, ) -> Result<&T, ReflectPathError<'p>>
where T: Reflect,

Returns a statically typed reference to the value specified by path. Read more
Source§

fn path_mut<'p, T>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut T, ReflectPathError<'p>>
where T: Reflect,

Returns a statically typed mutable reference to the value specified by path. Read more
Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> HitDataExtra for T
where T: Send + Sync + Debug + Any + 'static,

Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> InitializeFromFunction<T> for T

Source§

fn initialize_from_function(f: fn() -> T) -> T

Create an instance of this type from an initialization function
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<G> PatchFromTemplate for G
where G: FromTemplate,

Source§

type Template = <G as FromTemplate>::Template

The Template that will be patched.
Source§

fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
where F: FnOnce(&mut <G as PatchFromTemplate>::Template, &mut ResolveContext<'_>),

Takes a “patch function” func, and turns it into a TemplatePatch.
Source§

impl<T> PatchTemplate for T
where T: Template,

Source§

fn patch_template<F>(func: F) -> TemplatePatch<F, T>
where F: FnOnce(&mut T, &mut ResolveContext<'_>),

Takes a “patch function” func that patches this Template, and turns it into a TemplatePatch.
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Reflectable for T

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<Ret> SpawnIfAsync<(), Ret> for Ret

Source§

fn spawn(self) -> Ret

Spawn the value into the dioxus runtime if it is an async block
Source§

impl<T, O> SuperFrom<T> for O
where O: From<T>,

Source§

fn super_from(input: T) -> O

Convert from a type to another type.
Source§

impl<T, O, M> SuperInto<O, M> for T
where O: SuperFrom<T, M>,

Source§

fn super_into(self) -> O

Convert from a type to another type.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> Template for T
where T: Clone + Default + Unpin,

Source§

type Output = T

The type of value produced by this Template.
Source§

fn build_template( &self, _context: &mut TemplateContext<'_, '_>, ) -> Result<<T as Template>::Output, BevyError>

Uses this template and the given entity context to produce a Template::Output.
Source§

fn clone_template(&self) -> T

Clones this template. See Clone.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of this value.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more