 86ad5bf420
			
		
	
	
		86ad5bf420
		
	
	
	
	
		
			
			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>
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use bevy::{log::LogPlugin, prelude::*};
 | |
| 
 | |
| fn main() {
 | |
|     App::build()
 | |
|         .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);
 | |
|     }
 | |
| }
 |