Adding `WorldQuery` for `WithBundle` (#2024)
In response to #2023, here is a draft for a PR.
Fixes #2023
I've added an example to show how to use `WithBundle`, and also to test it out.
Right now there is a bug: If a bundle and a query are "the same", then it doesn't filter out
what it needs to filter out.
Example:
```
Print component initated from bundle.
[examples/ecs/query_bundle.rs:57] x = Dummy( <========= This should not get printed
111,
)
[examples/ecs/query_bundle.rs:57] x = Dummy(
222,
)
Show all components
[examples/ecs/query_bundle.rs:50] x = Dummy(
111,
)
[examples/ecs/query_bundle.rs:50] x = Dummy(
222,
)
```
However, it behaves the right way, if I add one more component to the bundle,
so the query and the bundle doesn't look the same:
```
Print component initated from bundle.
[examples/ecs/query_bundle.rs:57] x = Dummy(
222,
)
Show all components
[examples/ecs/query_bundle.rs:50] x = Dummy(
111,
)
[examples/ecs/query_bundle.rs:50] x = Dummy(
222,
)
```
I hope this helps. I'm definitely up for tinkering with this, and adding anything that I'm asked to add
or change.
Co-authored-by: Carter Anderson <mcanders1@gmail.com>
2021-04-28 21:03:10 +00:00
|
|
|
use bevy::{log::LogPlugin, prelude::*};
|
|
|
|
|
|
|
|
fn main() {
|
2021-06-02 02:59:17 +00:00
|
|
|
App::new()
|
Adding `WorldQuery` for `WithBundle` (#2024)
In response to #2023, here is a draft for a PR.
Fixes #2023
I've added an example to show how to use `WithBundle`, and also to test it out.
Right now there is a bug: If a bundle and a query are "the same", then it doesn't filter out
what it needs to filter out.
Example:
```
Print component initated from bundle.
[examples/ecs/query_bundle.rs:57] x = Dummy( <========= This should not get printed
111,
)
[examples/ecs/query_bundle.rs:57] x = Dummy(
222,
)
Show all components
[examples/ecs/query_bundle.rs:50] x = Dummy(
111,
)
[examples/ecs/query_bundle.rs:50] x = Dummy(
222,
)
```
However, it behaves the right way, if I add one more component to the bundle,
so the query and the bundle doesn't look the same:
```
Print component initated from bundle.
[examples/ecs/query_bundle.rs:57] x = Dummy(
222,
)
Show all components
[examples/ecs/query_bundle.rs:50] x = Dummy(
111,
)
[examples/ecs/query_bundle.rs:50] x = Dummy(
222,
)
```
I hope this helps. I'm definitely up for tinkering with this, and adding anything that I'm asked to add
or change.
Co-authored-by: Carter Anderson <mcanders1@gmail.com>
2021-04-28 21:03:10 +00:00
|
|
|
.add_plugin(LogPlugin)
|
|
|
|
.add_startup_system(setup.system())
|
|
|
|
.add_system(log_names.system().label(LogNamesSystem))
|
|
|
|
.add_system(log_person_bundles.system().after(LogNamesSystem))
|
|
|
|
.run();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)]
|
|
|
|
struct LogNamesSystem;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct Name(String);
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct Age(usize);
|
|
|
|
|
|
|
|
#[derive(Debug, Bundle)]
|
|
|
|
struct PersonBundle {
|
|
|
|
name: Name,
|
|
|
|
age: Age,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Sets up two entities, one with a [Name] component as part of a bundle,
|
|
|
|
/// and one entity with [Name] only.
|
|
|
|
fn setup(mut commands: Commands) {
|
|
|
|
commands.spawn().insert(Name("Steve".to_string()));
|
|
|
|
commands.spawn().insert_bundle(PersonBundle {
|
|
|
|
name: Name("Bob".to_string()),
|
|
|
|
age: Age(40),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
fn log_names(query: Query<&Name>) {
|
|
|
|
info!("Log all entities with `Name` component");
|
|
|
|
// this will necessarily have to print both components.
|
|
|
|
for name in query.iter() {
|
|
|
|
info!("{:?}", name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn log_person_bundles(query: Query<&Name, WithBundle<PersonBundle>>) {
|
|
|
|
info!("Log `Name` components from entities that have all components in `PersonBundle`.");
|
|
|
|
// this should only print `Name("Bob")`.
|
|
|
|
for name in query.iter() {
|
|
|
|
info!("{:?}", name);
|
|
|
|
}
|
|
|
|
}
|