bevy/examples/ecs/event.rs
Lena Milizé 73605f43b6 Replace the bool argument of Timer with TimerMode (#6247)
As mentioned in #2926, it's better to have an explicit type that clearly communicates the intent of the timer mode rather than an opaque boolean, which can be only understood when knowing the signature or having to look up the documentation.

This also opens up a way to merge different timers, such as `Stopwatch`, and possibly future ones, such as `DiscreteStopwatch` and `DiscreteTimer` from #2683, into one struct.

Signed-off-by: Lena Milizé <me@lvmn.org>

# Objective

Fixes #2926.

## Solution

Introduce `TimerMode` which replaces the `bool` argument of `Timer` constructors. A `Default` value for `TimerMode` is `Once`.

---

## Changelog

### Added

- `TimerMode` enum, along with variants `TimerMode::Once` and `TimerMode::Repeating`

### Changed

- Replace `bool` argument of `Timer::new` and `Timer::from_seconds` with `TimerMode`
- Change `repeating: bool` field of `Timer` with `mode: TimerMode`

## Migration Guide

- Replace `Timer::new(duration, false)` with `Timer::new(duration, TimerMode::Once)`.
- Replace `Timer::new(duration, true)` with `Timer::new(duration, TimerMode::Repeating)`.
- Replace `Timer::from_seconds(seconds, false)` with `Timer::from_seconds(seconds, TimerMode::Once)`.
- Replace `Timer::from_seconds(seconds, true)` with `Timer::from_seconds(seconds, TimerMode::Repeating)`.
- Change `timer.repeating()` to `timer.mode() == TimerMode::Repeating`.
2022-10-17 13:47:01 +00:00

64 lines
1.5 KiB
Rust

//! This example creates a new event, a system that triggers the event once per second,
//! and a system that prints a message whenever the event is received.
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_event::<MyEvent>()
.add_event::<PlaySound>()
.init_resource::<EventTriggerState>()
.add_system(event_trigger)
.add_system(event_listener)
.add_system(sound_player)
.run();
}
struct MyEvent {
pub message: String,
}
#[derive(Default)]
struct PlaySound;
#[derive(Resource)]
struct EventTriggerState {
event_timer: Timer,
}
impl Default for EventTriggerState {
fn default() -> Self {
EventTriggerState {
event_timer: Timer::from_seconds(1.0, TimerMode::Repeating),
}
}
}
// sends MyEvent and PlaySound every second
fn event_trigger(
time: Res<Time>,
mut state: ResMut<EventTriggerState>,
mut my_events: EventWriter<MyEvent>,
mut play_sound_events: EventWriter<PlaySound>,
) {
if state.event_timer.tick(time.delta()).finished() {
my_events.send(MyEvent {
message: "MyEvent just happened!".to_string(),
});
play_sound_events.send_default();
}
}
// prints events as they come in
fn event_listener(mut events: EventReader<MyEvent>) {
for my_event in events.iter() {
info!("{}", my_event.message);
}
}
fn sound_player(mut play_sound_events: EventReader<PlaySound>) {
for _ in play_sound_events.iter() {
info!("Playing a sound");
}
}