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);
}
pub fn spawn_maze(world: &mut World) {
pub fn spawn_level_command(world: &mut World) {
world.insert_resource(MazePluginLoaded);
world.run_system_once(systems::setup::setup);
}

View File

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

View File

@ -1,12 +1,14 @@
mod assets;
mod components;
pub mod components;
mod systems;
use bevy::prelude::*;
use bevy::{ecs::system::RunSystemOnce, prelude::*};
use components::Player;
use systems::spawn_player;
pub(super) fn plugin(app: &mut App) {
app.register_type::<Player>()
.add_systems(Startup, spawn_player);
app.register_type::<Player>().add_plugins(systems::plugin);
}
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::{
assets::{blue_material, generate_pill_mesh},
components::Player,
use crate::{
maze::MazeConfig,
player::{
assets::{blue_material, generate_pill_mesh},
components::Player,
},
};
use crate::maze::{events::RecreateMazeEvent, MazeConfig};
use bevy::prelude::*;
pub fn spawn_player(
@ -16,7 +18,7 @@ pub fn spawn_player(
commands.spawn((
Name::new("Player"),
Player,
Player { speed: 50. },
PbrBundle {
mesh: meshes.add(generate_pill_mesh(player_radius, player_height / 2.)),
material: materials.add(blue_material()),

View File

@ -2,7 +2,8 @@
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};
pub(super) fn plugin(app: &mut App) {
@ -21,6 +22,7 @@ pub(super) fn plugin(app: &mut App) {
fn spawn_level(mut commands: Commands) {
commands.queue(spawn_level_command);
commands.queue(spawn_player_command);
}
#[derive(Resource, Asset, Reflect, Clone)]