2023-10-13 10:53:26 +00:00
use crate ::insert_dependant_component ;
2023-07-26 21:59:28 +00:00
use bevy ::prelude ::* ;
use bevy_rapier3d ::prelude ::* ;
// this file is just for demo purposes, contains various types of components, systems etc
2023-10-13 10:53:26 +00:00
#[ derive(Component, Reflect, Default, Debug) ]
2023-07-26 21:59:28 +00:00
#[ reflect(Component) ]
2023-10-13 10:53:26 +00:00
pub enum SoundMaterial {
Metal ,
Wood ,
Rock ,
Cloth ,
Squishy ,
#[ default ]
None ,
2023-07-26 21:59:28 +00:00
}
2023-10-13 10:53:26 +00:00
#[ derive(Component, Reflect, Default, Debug) ]
2023-07-26 21:59:28 +00:00
#[ reflect(Component) ]
/// Demo marker component
pub struct Player ;
2023-10-13 10:53:26 +00:00
#[ derive(Component, Reflect, Default, Debug) ]
2023-07-26 21:59:28 +00:00
#[ reflect(Component) ]
2023-10-13 10:53:26 +00:00
/// Demo component showing auto injection of components
2023-07-26 21:59:28 +00:00
pub struct ShouldBeWithPlayer ;
2023-10-13 10:53:26 +00:00
#[ derive(Component, Reflect, Default, Debug) ]
2023-07-26 21:59:28 +00:00
#[ reflect(Component) ]
/// Demo marker component
pub struct Interactible ;
2023-10-13 10:53:26 +00:00
#[ derive(Component, Reflect, Default, Debug) ]
2023-07-27 13:14:17 +00:00
#[ reflect(Component) ]
/// Demo marker component
pub struct Pickable ;
2023-07-26 21:59:28 +00:00
fn player_move_demo (
keycode : Res < Input < KeyCode > > ,
mut players : Query < & mut Transform , With < Player > > ,
2023-10-13 10:53:26 +00:00
) {
2023-07-26 21:59:28 +00:00
let speed = 0.2 ;
if let Ok ( mut player ) = players . get_single_mut ( ) {
if keycode . pressed ( KeyCode ::Left ) {
player . translation . x + = speed ;
}
if keycode . pressed ( KeyCode ::Right ) {
player . translation . x - = speed ;
}
if keycode . pressed ( KeyCode ::Up ) {
player . translation . z + = speed ;
}
if keycode . pressed ( KeyCode ::Down ) {
player . translation . z - = speed ;
}
}
}
// collision tests/debug
pub fn test_collision_events (
mut collision_events : EventReader < CollisionEvent > ,
mut contact_force_events : EventReader < ContactForceEvent > ,
2023-10-13 10:53:26 +00:00
) {
2023-07-26 21:59:28 +00:00
for collision_event in collision_events . iter ( ) {
println! ( " collision " ) ;
match collision_event {
2023-10-13 10:53:26 +00:00
CollisionEvent ::Started ( _entity1 , _entity2 , _ ) = > {
2023-07-26 21:59:28 +00:00
println! ( " collision started " )
}
2023-10-13 10:53:26 +00:00
CollisionEvent ::Stopped ( _entity1 , _entity2 , _ ) = > {
2023-07-26 21:59:28 +00:00
println! ( " collision ended " )
}
}
}
for contact_force_event in contact_force_events . iter ( ) {
println! ( " Received contact force event: {:?} " , contact_force_event ) ;
}
}
pub struct DemoPlugin ;
impl Plugin for DemoPlugin {
2023-10-13 10:53:26 +00:00
fn build ( & self , app : & mut App ) {
app . register_type ::< Interactible > ( )
. register_type ::< Pickable > ( )
. register_type ::< SoundMaterial > ( )
. register_type ::< Player > ( )
// little helper utility, to automatically inject components that are dependant on an other component
// ie, here an Entity with a Player component should also always have a ShouldBeWithPlayer component
// you get a warning if you use this, as I consider this to be stop-gap solution (usually you should have either a bundle, or directly define all needed components)
. add_systems (
Update ,
(
insert_dependant_component ::< Player , ShouldBeWithPlayer > ,
player_move_demo , //.run_if(in_state(AppState::Running)),
test_collision_events ,
) ,
) ;
}
2023-07-26 21:59:28 +00:00
}