mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 07:04:33 +00:00
Add removal_detection example (#945)
Co-authored-by: Carter Anderson <mcanders1@gmail.com>
This commit is contained in:
parent
f35f813137
commit
d9c428e32c
3 changed files with 85 additions and 0 deletions
|
@ -10,6 +10,7 @@ current changes on git with [previous release tags][git_tag_comparison].
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- [`bevy_log`][836]
|
- [`bevy_log`][836]
|
||||||
- Adds logging functionality as a Plugin.
|
- Adds logging functionality as a Plugin.
|
||||||
- Changes internal logging to work with the new implementation.
|
- Changes internal logging to work with the new implementation.
|
||||||
|
@ -21,7 +22,10 @@ current changes on git with [previous release tags][git_tag_comparison].
|
||||||
- [Added `set_cursor_position` to `Window`][917]
|
- [Added `set_cursor_position` to `Window`][917]
|
||||||
- [Added new Bevy reflection system][926]
|
- [Added new Bevy reflection system][926]
|
||||||
- Replaces the properties system
|
- Replaces the properties system
|
||||||
|
- [Add removal_detection example][945]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- [FileAssetIo includes full path on error][821]
|
- [FileAssetIo includes full path on error][821]
|
||||||
- [Removed ECS query APIs that could easily violate safety from the public interface][829]
|
- [Removed ECS query APIs that could easily violate safety from the public interface][829]
|
||||||
- [Changed Query filter API to be easier to understand][834]
|
- [Changed Query filter API to be easier to understand][834]
|
||||||
|
@ -33,7 +37,9 @@ current changes on git with [previous release tags][git_tag_comparison].
|
||||||
- Created getters to get `Time` state and made members private.
|
- Created getters to get `Time` state and made members private.
|
||||||
- Modifying `Time`'s values directly is no longer possible outside of bevy.
|
- Modifying `Time`'s values directly is no longer possible outside of bevy.
|
||||||
- [Use `mailbox` instead of `fifo` for vsync on supported systems][920]
|
- [Use `mailbox` instead of `fifo` for vsync on supported systems][920]
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- [Fixed typos in KeyCode identifiers][857]
|
- [Fixed typos in KeyCode identifiers][857]
|
||||||
- [Don't draw text that isn't visible][893]
|
- [Don't draw text that isn't visible][893]
|
||||||
- [Use `instant::Instant` for WASM compatibility][895]
|
- [Use `instant::Instant` for WASM compatibility][895]
|
||||||
|
@ -60,6 +66,7 @@ current changes on git with [previous release tags][git_tag_comparison].
|
||||||
[926]: https://github.com/bevyengine/bevy/pull/926
|
[926]: https://github.com/bevyengine/bevy/pull/926
|
||||||
[931]: https://github.com/bevyengine/bevy/pull/931
|
[931]: https://github.com/bevyengine/bevy/pull/931
|
||||||
[934]: https://github.com/bevyengine/bevy/pull/934
|
[934]: https://github.com/bevyengine/bevy/pull/934
|
||||||
|
[945]: https://github.com/bevyengine/bevy/pull/945
|
||||||
[955]: https://github.com/bevyengine/bevy/pull/955
|
[955]: https://github.com/bevyengine/bevy/pull/955
|
||||||
|
|
||||||
## Version 0.3.0 (2020-11-03)
|
## Version 0.3.0 (2020-11-03)
|
||||||
|
|
|
@ -326,6 +326,10 @@ path = "examples/window/multiple_windows.rs"
|
||||||
name = "window_settings"
|
name = "window_settings"
|
||||||
path = "examples/window/window_settings.rs"
|
path = "examples/window/window_settings.rs"
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "removal_detection"
|
||||||
|
path = "examples/ecs/removal_detection.rs"
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "hello_wasm"
|
name = "hello_wasm"
|
||||||
path = "examples/wasm/hello_wasm.rs"
|
path = "examples/wasm/hello_wasm.rs"
|
||||||
|
|
74
examples/ecs/removal_detection.rs
Normal file
74
examples/ecs/removal_detection.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
// This example shows how you can know when a `Component` has been removed, so you can react to it.
|
||||||
|
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Information regarding removed `Component`s is discarded at the end of each frame, so you need
|
||||||
|
// to react to the removal before the frame is over.
|
||||||
|
//
|
||||||
|
// Also, `Components` are removed via a `Command`. `Command`s are applied after a stage has
|
||||||
|
// finished executing. So you need to react to the removal at some stage after the
|
||||||
|
// `Component` is removed.
|
||||||
|
//
|
||||||
|
// With these constraints in mind we make sure to place the system that removes a `Component` on
|
||||||
|
// the `stage::UPDATE` stage, and the system that reacts on the removal on the
|
||||||
|
// `stage::POST_UPDATE` stage.
|
||||||
|
App::build()
|
||||||
|
.add_plugins(DefaultPlugins)
|
||||||
|
.add_startup_system(setup.system())
|
||||||
|
.add_system_to_stage(stage::UPDATE, remove_component.system())
|
||||||
|
.add_system_to_stage(stage::POST_UPDATE, react_on_removal.system())
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This `Struct` is just used for convenience in this example. This is the `Component` we'll be
|
||||||
|
// giving to the `Entity` so we have a `Component` to remove in `remove_component()`.
|
||||||
|
struct MyComponent;
|
||||||
|
|
||||||
|
fn setup(
|
||||||
|
commands: &mut Commands,
|
||||||
|
asset_server: Res<AssetServer>,
|
||||||
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
||||||
|
) {
|
||||||
|
let texture = asset_server.load("branding/icon.png");
|
||||||
|
|
||||||
|
commands
|
||||||
|
.spawn(Camera2dBundle::default())
|
||||||
|
.spawn(SpriteBundle {
|
||||||
|
material: materials.add(texture.into()),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.with(MyComponent); // Add the `Component`.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_component(
|
||||||
|
time: Res<Time>,
|
||||||
|
commands: &mut Commands,
|
||||||
|
query: Query<Entity, With<MyComponent>>,
|
||||||
|
) {
|
||||||
|
// After two seconds have passed the `Component` is removed.
|
||||||
|
if time.seconds_since_startup() > 2.0 {
|
||||||
|
if let Some(entity) = query.iter().next() {
|
||||||
|
commands.remove_one::<MyComponent>(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn react_on_removal(
|
||||||
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
||||||
|
query: Query<(Entity, &Handle<ColorMaterial>)>,
|
||||||
|
) {
|
||||||
|
// Note: usually this isn't how you would handle a `Query`. In this example it makes things
|
||||||
|
// a bit easier to read.
|
||||||
|
let (query_entity, material) = query.iter().next().unwrap();
|
||||||
|
|
||||||
|
// `Query.removed<T>` returns an array with the `Entity`s in the `Query` that had its
|
||||||
|
// `Component` `T` (in this case `MyComponent`) removed at some point earlier during the frame.
|
||||||
|
for entity in query.removed::<MyComponent>() {
|
||||||
|
// We compare the `Entity` that had its `MyComponent` `Component` removed with the `Entity`
|
||||||
|
// in the current `Query`. If they match all red is removed from the material.
|
||||||
|
if query_entity == *entity {
|
||||||
|
materials.get_mut(material).unwrap().color.set_r(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue