diff --git a/src/gameplay/combat.rs b/src/gameplay/combat.rs new file mode 100644 index 0000000..d09dd9b --- /dev/null +++ b/src/gameplay/combat.rs @@ -0,0 +1,24 @@ +use bevy::{ + camera::visibility::RenderLayers, post_process::bloom::Bloom, prelude::*, sprite::Anchor, +}; +use rand::Rng; + +use crate::{ + GameState, PauseState, + utils::input::{GameInputPlugin, InputButton, InputPressStatus}, +}; + +pub struct CombatPlugin; + +impl Plugin for CombatPlugin { + fn build(&self, app: &mut App) { + app.add_message::() + .add_message::(); + } +} + +#[derive(Message)] +pub struct StartCombat(pub i32); + +#[derive(Message)] +pub struct FinishedCombat(pub i32); diff --git a/src/gameplay/mod.rs b/src/gameplay/mod.rs index b6b3a32..37a2bbb 100644 --- a/src/gameplay/mod.rs +++ b/src/gameplay/mod.rs @@ -1,2 +1,3 @@ +pub mod combat; pub mod navi; pub mod pause; diff --git a/src/gameplay/navi.rs b/src/gameplay/navi.rs index def8fa4..5561b19 100644 --- a/src/gameplay/navi.rs +++ b/src/gameplay/navi.rs @@ -5,6 +5,7 @@ use rand::Rng; use crate::{ GameState, PauseState, + gameplay::combat::StartCombat, utils::input::{GameInputPlugin, InputButton, InputPressStatus}, }; @@ -20,6 +21,8 @@ impl Plugin for NaviGameplayPlugin { ( move_player .run_if(in_state(GameState::Navi).and(in_state(PauseState::Running))), + detect_colision + .run_if(in_state(GameState::Navi).and(in_state(PauseState::Running))), follow_player, ), ); @@ -68,14 +71,18 @@ pub fn spawn_bus(mut commands: Commands, asset_server: Res) { )); } +#[derive(Component)] +pub struct MapEncounter(i32); + pub fn spawn_enemy( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { let mut rng = rand::rng(); - for _ in 0..10 { + for i in 0..10 { commands.spawn(( + MapEncounter(i), Mesh2d(meshes.add(Circle::new(10.))), MeshMaterial2d(materials.add(Color::srgb(1.1, 0.2, 0.3))), Transform::from_xyz( @@ -121,6 +128,21 @@ pub fn move_player( } } +fn detect_colision( + player: Single<&Transform, With>, + enemies: Query<(&Transform, &MapEncounter), (With, Without)>, + mut start_combat_writer: MessageWriter, + mut next_state: ResMut>, // May or may not need +) { + for (en_trans, enc) in enemies { + if (en_trans.translation - player.translation).length() < 30. { + info!("colide {}", enc.0); + start_combat_writer.write(StartCombat(enc.0)); + next_state.set(GameState::Combat); + } + } +} + fn follow_player( mut camera: Single<&mut Transform, (With, Without)>, player: Single<&Transform, (With, Without)>, diff --git a/src/main.rs b/src/main.rs index f75bfd7..e0573d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use bevy::{post_process::bloom::Bloom, prelude::*, sprite::Anchor}; use crate::{ - gameplay::{navi::NaviGameplayPlugin, pause::PausePlugin}, + gameplay::{combat::CombatPlugin, navi::NaviGameplayPlugin, pause::PausePlugin}, utils::input::{GameInputPlugin, InputButton, InputPressStatus}, }; @@ -33,6 +33,7 @@ fn main() { GameInputPlugin, NaviGameplayPlugin, PausePlugin, + CombatPlugin, )) .init_state::() .init_state::()