2023-09-28 12:10:45 +00:00
pub mod in_game ;
pub use in_game ::* ;
pub mod in_main_menu ;
pub use in_main_menu ::* ;
pub mod picking ;
pub use picking ::* ;
2023-07-26 21:59:28 +00:00
use bevy ::prelude ::* ;
use bevy_rapier3d ::prelude ::* ;
2023-09-28 12:10:45 +00:00
use crate ::{ insert_dependant_component , state ::{ AppState , GameState } } ;
2023-07-26 21:59:28 +00:00
// this file is just for demo purposes, contains various types of components, systems etc
#[ derive(Component, Reflect, Default, Debug, ) ]
#[ reflect(Component) ]
pub enum SoundMaterial {
Metal ,
Wood ,
Rock ,
Cloth ,
Squishy ,
#[ default ]
None
}
#[ derive(Component, Reflect, Default, Debug, ) ]
#[ reflect(Component) ]
/// Demo marker component
pub struct Player ;
#[ derive(Component, Reflect, Default, Debug, ) ]
#[ reflect(Component) ]
/// Demo component showing auto injection of components
pub struct ShouldBeWithPlayer ;
#[ derive(Component, Reflect, Default, Debug, ) ]
#[ reflect(Component) ]
/// Demo marker component
pub struct Interactible ;
2023-09-28 12:10:45 +00:00
2023-07-27 13:14:17 +00:00
2023-07-26 21:59:28 +00:00
fn player_move_demo (
keycode : Res < Input < KeyCode > > ,
mut players : Query < & mut Transform , With < Player > > ,
) {
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 > ,
)
{
for collision_event in collision_events . iter ( ) {
println! ( " collision " ) ;
match collision_event {
2023-07-26 22:07:04 +00:00
CollisionEvent ::Started ( _entity1 , _entity2 , _ ) = > {
2023-07-26 21:59:28 +00:00
println! ( " collision started " )
}
2023-07-26 22:07:04 +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 ) ;
}
}
2023-09-28 12:10:45 +00:00
pub struct GamePlugin ;
impl Plugin for GamePlugin {
2023-07-26 21:59:28 +00:00
fn build ( & self , app : & mut App ) {
app
2023-09-28 12:10:45 +00:00
. add_plugins ( PickingPlugin )
2023-07-26 21:59:28 +00:00
. register_type ::< Interactible > ( )
. 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 , (
2023-09-28 12:10:45 +00:00
// insert_dependant_component::<Player, ShouldBeWithPlayer>,
2023-07-26 21:59:28 +00:00
player_move_demo , //.run_if(in_state(AppState::Running)),
2023-09-28 12:10:45 +00:00
// test_collision_events
)
. run_if ( in_state ( GameState ::InGame ) ) )
. add_systems (
OnEnter ( AppState ::MenuRunning ) ,
setup_main_menu
)
. add_systems (
OnExit ( AppState ::MenuRunning ) ,
teardown_main_menu
)
. add_systems ( Update , ( main_menu ) )
. add_systems (
OnEnter ( AppState ::AppRunning ) ,
setup_game
)
2023-07-26 21:59:28 +00:00
;
}
}