feat!: fix some lifetimes in InputContainerInner, almast done one example, add default for plugin, rebase src from crate/bevy_controls to src

This commit is contained in:
2024-02-10 02:42:18 +01:00
parent 5fc1382ceb
commit 608781faf6
19 changed files with 899 additions and 84 deletions
+213 -1
View File
@@ -1,3 +1,215 @@
fn main() {
//! This example illustrates how to create
//!
//! It displays
//!
//! Yeah I know, now it's a bit ugly
use bevy::{
diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin},
ecs::schedule::States,
prelude::*,
};
use bevy_controls::{
contract::{
Action, ActionInner, GameState, GameStateInner, InputsContainer, InputsContainerInner,
},
plugin::ControlsPlugin,
resource::{Binding, ButtonCombination, Controls, InputType, Inputs, PlayerInputs},
};
use strum::IntoEnumIterator;
use strum_macros::EnumIter;
const FIRA_CODE_PATH: &str = "font/FiraCode/FiraCode-VariableFont_wght.ttf";
#[derive(PartialEq, Eq, Hash, EnumIter, Clone, Copy)]
enum MyAction {
MoveForward,
MoveBack,
MoveLeft,
MoveRight,
Jump,
Interact,
Shoot,
Scope,
}
impl Action for MyAction {}
impl ActionInner for MyAction {}
#[derive(States, PartialEq, Eq, Clone, Hash, Debug, Default)]
enum MyGameState {
#[default]
InGame,
}
impl GameState for MyGameState {}
impl GameStateInner for MyGameState {}
#[derive(Resource, Default, Clone)]
struct MyInputsContainer {
// When the game does not provide multiplayer, one field is enough
player_inputs: PlayerInputs<MyAction>,
}
impl InputsContainer<MyAction> for MyInputsContainer {}
impl InputsContainerInner<MyAction> for MyInputsContainer {
fn iter_inputs<'a>(&'a self) -> Box<dyn Iterator<Item = &'a PlayerInputs<MyAction>> + 'a> {
todo!()
}
fn me<'a>(&'a self) -> Option<&'a PlayerInputs<MyAction>> {
Some(& self.player_inputs)
}
fn me_mut<'a>(&'a mut self) -> Option<&'a mut PlayerInputs<MyAction>> {
Some(&mut self.player_inputs)
}
}
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(AssetPlugin {
file_path: "asset".into(),
..default()
}),
ControlsPlugin::<MyAction, MyInputsContainer, MyGameState>::default(),
))
.add_systems(Startup, (add_bindings, setup))
.run();
}
// TODO: default bingings...
fn add_bindings(mut controls: ResMut<Controls<MyAction, MyGameState>>) {
controls.push(
MyAction::MoveForward,
Binding::new(ButtonCombination::Single(InputType::Keyboard(KeyCode::W))),
);
}
#[derive(Component)]
struct TextBlock;
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(Camera2dBundle::default());
commands.spawn((
TextBundle::from_sections([
TextSection::new(
"Input: ",
TextStyle {
font: asset_server.load(FIRA_CODE_PATH),
font_size: 60.0,
..default()
},
),
TextSection::new(
"A ",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"S ",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"W ",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"D ",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"\nAction: ",
TextStyle {
font: asset_server.load(FIRA_CODE_PATH),
font_size: 60.0,
..default()
},
),
TextSection::new(
"MoveLeft",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"MoveBack",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"MoveForward",
TextStyle {
font_size: 60.0,
..default()
},
),
TextSection::new(
"MoveRight",
TextStyle {
font_size: 60.0,
..default()
},
),
]),
TextBlock,
));
}
// text sections indexes
const A_INDEX: usize = 2;
const S_INDEX: usize = 3;
const W_INDEX: usize = 4;
const D_INDEX: usize = 5;
const MOVE_LEFT_INDEX: usize = 6;
const MOVE_BACK_INDEX: usize = 7;
const MOVE_FORWARD_INDEX: usize = 8;
const MOVE_RIGHT_INDEX: usize = 9;
fn text_update_system(
mut query: Query<&mut Text, With<TextBlock>>,
inputs_container: MyInputsContainer,
) {
for mut text in &mut query {
let input_value = inputs_container.me().expect("This is bad").get(MyAction::MoveLeft);
if input_value.is_boolean() && input_value.to_boolean() {
text.sections[MOVE_LEFT_INDEX].style.color = Color::GOLD;
} else {
text.sections[MOVE_LEFT_INDEX].style.color = Color::GOLD;
}
}
}
// fn text_update_system(
// diagnostics: Res<DiagnosticsStore>,
// mut query: Query<&mut Text, With<FpsText>>,
// ) {
// for mut text in &mut query {
// if let Some(fps) = diagnostics.get(FrameTimeDiagnosticsPlugin::FPS) {
// if let Some(value) = fps.smoothed() {
// // Update the value of the second section
// text.sections[1].value = format!("{value:.2}");
// }
// }
// }
// }