mirror of
https://github.com/kristoferssolo/maze-ascension.git
synced 2025-10-21 19:20:34 +00:00
feat(player): add movement system
This commit is contained in:
parent
6f0f8471c5
commit
0fb3504b81
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
9
src/player/systems/mod.rs
Normal file
9
src/player/systems/mod.rs
Normal 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);
|
||||||
|
}
|
||||||
38
src/player/systems/movement.rs
Normal file
38
src/player/systems/movement.rs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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()),
|
||||||
@ -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)]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user