feat(player): add movement system

This commit is contained in:
Kristofers Solo 2024-12-09 20:25:33 +02:00
parent 6f0f8471c5
commit 0fb3504b81
7 changed files with 69 additions and 14 deletions

View File

@ -15,7 +15,7 @@ pub(super) fn plugin(app: &mut App) {
.add_systems(Update, handle_maze_recreation_event); .add_systems(Update, handle_maze_recreation_event);
} }
pub fn spawn_maze(world: &mut World) { pub fn spawn_level_command(world: &mut World) {
world.insert_resource(MazePluginLoaded); world.insert_resource(MazePluginLoaded);
world.run_system_once(systems::setup::setup); world.run_system_once(systems::setup::setup);
} }

View File

@ -1,5 +1,7 @@
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Default, Reflect)] #[derive(Component, Debug, Clone, Copy, PartialEq, Default, Reflect)]
#[reflect(Component)] #[reflect(Component)]
pub struct Player; pub struct Player {
pub speed: f32,
}

View File

@ -1,12 +1,14 @@
mod assets; mod assets;
mod components; pub mod components;
mod systems; mod systems;
use bevy::prelude::*; use bevy::{ecs::system::RunSystemOnce, prelude::*};
use components::Player; use components::Player;
use systems::spawn_player;
pub(super) fn plugin(app: &mut App) { pub(super) fn plugin(app: &mut App) {
app.register_type::<Player>() app.register_type::<Player>().add_plugins(systems::plugin);
.add_systems(Startup, spawn_player); }
pub fn spawn_player_command(world: &mut World) {
world.run_system_once(systems::spawn::spawn_player);
} }

View File

@ -0,0 +1,9 @@
pub mod movement;
pub mod spawn;
use bevy::prelude::*;
use movement::player_movement;
pub(super) fn plugin(app: &mut App) {
app.add_systems(Update, player_movement);
}

View File

@ -0,0 +1,38 @@
use bevy::prelude::*;
use hexx::{EdgeDirection, Hex};
use crate::{maze::MazeConfig, player::components::Player};
const fn create_direction(key: &KeyCode) -> Option<EdgeDirection> {
match key {
KeyCode::KeyD => Some(EdgeDirection::FLAT_SOUTH),
KeyCode::KeyS => Some(EdgeDirection::FLAT_NORTH_EAST),
KeyCode::KeyA => Some(EdgeDirection::FLAT_NORTH),
KeyCode::KeyQ => Some(EdgeDirection::FLAT_NORTH_WEST),
KeyCode::KeyW => Some(EdgeDirection::FLAT_SOUTH_WEST),
KeyCode::KeyE => Some(EdgeDirection::FLAT_SOUTH_EAST),
_ => None,
}
}
pub fn player_movement(
time: Res<Time>,
input: Res<ButtonInput<KeyCode>>,
mut player_query: Query<(&Player, &mut Transform)>,
maze_config: Res<MazeConfig>,
) {
for (player, mut transform) in player_query.iter_mut() {
let direction = input.get_pressed().find_map(|key| create_direction(key));
if let Some(hex_dir) = direction {
let hex_vec = Hex::from(hex_dir);
let world_pos = maze_config.layout.hex_to_world_pos(hex_vec);
let move_vec = Vec3::new(world_pos.x, 0.0, world_pos.y).normalize()
* player.speed
* time.delta_seconds();
transform.translation += move_vec;
}
}
}

View File

@ -1,8 +1,10 @@
use super::{ use crate::{
maze::MazeConfig,
player::{
assets::{blue_material, generate_pill_mesh}, assets::{blue_material, generate_pill_mesh},
components::Player, components::Player,
},
}; };
use crate::maze::{events::RecreateMazeEvent, MazeConfig};
use bevy::prelude::*; use bevy::prelude::*;
pub fn spawn_player( pub fn spawn_player(
@ -16,7 +18,7 @@ pub fn spawn_player(
commands.spawn(( commands.spawn((
Name::new("Player"), Name::new("Player"),
Player, Player { speed: 50. },
PbrBundle { PbrBundle {
mesh: meshes.add(generate_pill_mesh(player_radius, player_height / 2.)), mesh: meshes.add(generate_pill_mesh(player_radius, player_height / 2.)),
material: materials.add(blue_material()), material: materials.add(blue_material()),

View File

@ -2,7 +2,8 @@
use bevy::{input::common_conditions::input_just_pressed, prelude::*}; use bevy::{input::common_conditions::input_just_pressed, prelude::*};
use crate::maze::spawn_maze as spawn_level_command; use crate::maze::spawn_level_command;
use crate::player::spawn_player_command;
use crate::{asset_tracking::LoadResource, audio::Music, screens::Screen}; use crate::{asset_tracking::LoadResource, audio::Music, screens::Screen};
pub(super) fn plugin(app: &mut App) { pub(super) fn plugin(app: &mut App) {
@ -21,6 +22,7 @@ pub(super) fn plugin(app: &mut App) {
fn spawn_level(mut commands: Commands) { fn spawn_level(mut commands: Commands) {
commands.queue(spawn_level_command); commands.queue(spawn_level_command);
commands.queue(spawn_player_command);
} }
#[derive(Resource, Asset, Reflect, Clone)] #[derive(Resource, Asset, Reflect, Clone)]