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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
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::{
|
||||
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()),
|
||||
@ -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)]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user