slight reorg

This commit is contained in:
gyoder 2025-12-18 14:25:55 -05:00
parent 92c8c288bc
commit a703f6ab85
5 changed files with 139 additions and 105 deletions

1
Cargo.lock generated
View file

@ -1312,6 +1312,7 @@ dependencies = [
"bevy", "bevy",
"enumset", "enumset",
"rand", "rand",
"serde",
] ]
[[package]] [[package]]

View file

@ -7,3 +7,4 @@ edition = "2024"
bevy = "0.17.3" bevy = "0.17.3"
enumset = "1.1.10" enumset = "1.1.10"
rand = "0.9.2" rand = "0.9.2"
serde = { version = "1.0.228", features = ["derive"] }

1
src/gameplay/mod.rs Normal file
View file

@ -0,0 +1 @@
pub mod navi;

120
src/gameplay/navi.rs Normal file
View file

@ -0,0 +1,120 @@
use bevy::{post_process::bloom::Bloom, prelude::*, sprite::Anchor};
use rand::Rng;
use crate::{
GameState, PauseState,
utils::input::{GameInputPlugin, InputButton, InputPressStatus},
};
const PLAYER_SPEED: f32 = 100.;
pub struct NaviGameplayPlugin;
impl Plugin for NaviGameplayPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, (setup_scene, spawn_bus, spawn_enemy))
.add_systems(
Update,
(
move_player
.run_if(in_state(GameState::Navi).and(in_state(PauseState::Running))),
follow_player,
),
);
}
}
#[derive(Component)]
pub struct PlayerVWBus;
pub fn setup_scene(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
commands.spawn((
Mesh2d(meshes.add(Rectangle::new(1000., 70.))),
MeshMaterial2d(materials.add(Color::srgb(0.2, 0.2, 0.3))),
));
commands.spawn((Camera2d, Bloom::NATURAL));
}
pub fn spawn_bus(mut commands: Commands, asset_server: Res<AssetServer>) {
let texture = asset_server.load("bus/basicbus.png");
commands.spawn((
PlayerVWBus,
Sprite {
image: texture,
custom_size: Some(Vec2::new(192., 133.)),
..default()
},
Transform::from_xyz(2., 0., 3.),
Anchor::CENTER,
));
}
pub fn spawn_enemy(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let mut rng = rand::rng();
for _ in 0..10 {
commands.spawn((
Mesh2d(meshes.add(Circle::new(10.))),
MeshMaterial2d(materials.add(Color::srgb(1.1, 0.2, 0.3))),
Transform::from_xyz(
rng.random_range(-600..600) as f32,
rng.random_range(-600..600) as f32,
1.,
),
));
}
}
pub fn move_player(
mut player: Single<&mut Transform, With<PlayerVWBus>>,
mut player_sprite: Single<&mut Sprite, With<PlayerVWBus>>,
time: Res<Time>,
buttons_pressed: Res<InputPressStatus>,
) {
let mut direction = Vec2::ZERO;
if buttons_pressed.contains(InputButton::Up) {
direction.y += 1.;
}
if buttons_pressed.contains(InputButton::Down) {
direction.y -= 1.;
}
if buttons_pressed.contains(InputButton::Left) {
direction.x -= 1.;
}
if buttons_pressed.contains(InputButton::Right) {
direction.x += 1.;
}
let move_delta = direction.normalize_or_zero() * PLAYER_SPEED * time.delta_secs();
player.translation += move_delta.extend(0.);
if direction.x > 0. {
player_sprite.flip_x = true;
} else if direction.x < 0. {
player_sprite.flip_x = false;
}
}
pub fn follow_player(
mut camera: Single<&mut Transform, (With<Camera2d>, Without<PlayerVWBus>)>,
player: Single<&Transform, (With<PlayerVWBus>, Without<Camera2d>)>,
time: Res<Time>,
) {
let Vec3 { x, y, .. } = player.translation;
let direction = Vec3::new(x, y, camera.translation.z);
camera
.translation
.smooth_nudge(&direction, 10., time.delta_secs());
}

View file

@ -1,125 +1,36 @@
use bevy::{post_process::bloom::Bloom, prelude::*, sprite::Anchor}; use bevy::{post_process::bloom::Bloom, prelude::*, sprite::Anchor};
use rand::Rng; use rand::Rng;
use crate::utils::input::{GameInputPlugin, InputButton, InputPressStatus}; use crate::{
gameplay::navi::NaviGameplayPlugin,
utils::input::{GameInputPlugin, InputButton, InputPressStatus},
};
mod gameplay;
mod utils; mod utils;
#[derive(Component)]
pub struct PlayerVWBus;
#[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)] #[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)]
pub enum GameState { pub enum GameState {
#[default] #[default]
Navi, Navi,
Pause,
Combat, Combat,
MainMenu,
} }
const PLAYER_SPEED: f32 = 100.; #[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)]
pub enum PauseState {
#[default]
Running,
Paused,
AnimatingIntoPause,
AnimatingOutOfPause,
}
fn main() { fn main() {
println!("Hello, world!"); println!("Hello, world!");
App::new() App::new()
.add_plugins((DefaultPlugins, GameInputPlugin)) .add_plugins((DefaultPlugins, GameInputPlugin, NaviGameplayPlugin))
.init_state::<GameState>() .init_state::<GameState>()
.add_systems(Startup, (setup_scene, spawn_bus, spawn_enemy)) .init_state::<PauseState>()
.add_systems(
Update,
(move_player.run_if(in_state(GameState::Navi)), follow_player),
)
.run(); .run();
} }
fn setup_scene(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
commands.spawn((
Mesh2d(meshes.add(Rectangle::new(1000., 70.))),
MeshMaterial2d(materials.add(Color::srgb(0.2, 0.2, 0.3))),
));
commands.spawn((Camera2d, Bloom::NATURAL));
}
fn spawn_bus(mut commands: Commands, asset_server: Res<AssetServer>) {
let texture = asset_server.load("bus/basicbus.png");
commands.spawn((
PlayerVWBus,
Sprite {
image: texture,
custom_size: Some(Vec2::new(192., 133.)),
..default()
},
Transform::from_xyz(2., 0., 3.),
Anchor::CENTER,
));
}
fn spawn_enemy(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let mut rng = rand::rng();
for _ in 0..10 {
commands.spawn((
Mesh2d(meshes.add(Circle::new(10.))),
MeshMaterial2d(materials.add(Color::srgb(1.1, 0.2, 0.3))),
Transform::from_xyz(
rng.random_range(-600..600) as f32,
rng.random_range(-600..600) as f32,
1.,
),
));
}
}
fn move_player(
mut player: Single<&mut Transform, With<PlayerVWBus>>,
mut player_sprite: Single<&mut Sprite, With<PlayerVWBus>>,
time: Res<Time>,
buttons_pressed: Res<InputPressStatus>,
) {
let mut direction = Vec2::ZERO;
if buttons_pressed.contains(InputButton::Up) {
direction.y += 1.;
}
if buttons_pressed.contains(InputButton::Down) {
direction.y -= 1.;
}
if buttons_pressed.contains(InputButton::Left) {
direction.x -= 1.;
}
if buttons_pressed.contains(InputButton::Right) {
direction.x += 1.;
}
let move_delta = direction.normalize_or_zero() * PLAYER_SPEED * time.delta_secs();
player.translation += move_delta.extend(0.);
if direction.x > 0. {
player_sprite.flip_x = true;
} else if direction.x < 0. {
player_sprite.flip_x = false;
}
}
fn follow_player(
mut camera: Single<&mut Transform, (With<Camera2d>, Without<PlayerVWBus>)>,
player: Single<&Transform, (With<PlayerVWBus>, Without<Camera2d>)>,
time: Res<Time>,
) {
let Vec3 { x, y, .. } = player.translation;
let direction = Vec3::new(x, y, camera.translation.z);
camera
.translation
.smooth_nudge(&direction, 10., time.delta_secs());
}