This commit is contained in:
2024-11-01 18:03:45 +02:00
commit 156be812fc
5 changed files with 4881 additions and 0 deletions

69
src/player.rs Normal file
View File

@@ -0,0 +1,69 @@
use bevy::prelude::*;
use bevy_ecs_ldtk::prelude::*;
use bevy_rapier2d::dynamics::Velocity;
use crate::{climbing::Climber, inventory::Inventory};
use crate::{colliders::ColliderBundle, ground_detection::GroundDetection};
#[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Component)]
pub struct Player;
#[derive(Clone, Default, Bundle, LdtkEntity)]
pub struct PlayerBundle {
#[sprite_bundle("player.png")]
pub sprite_bundle: SpriteBundle,
#[from_entity_instance]
pub collider_bundle: ColliderBundle,
pub player: Player,
#[worldly]
pub worldly: Worldly,
pub climber: Climber,
pub ground_detection: GroundDetection,
// Build Items Component manually by using `impl From<&EntityInstance>`
#[from_entity_instance]
items: Inventory,
// The whole EntityInstance can be stored directly as an EntityInstance component
#[from_entity_instance]
entity_instance: EntityInstance,
}
pub fn player_movement(
input: Res<ButtonInput<KeyCode>>,
mut query: Query<(&mut Velocity, &mut Climber, &GroundDetection), With<Player>>,
) {
for (mut velocity, mut climber, ground_detection) in &mut query {
let right = if input.pressed(KeyCode::KeyD) { 1. } else { 0. };
let left = if input.pressed(KeyCode::KeyA) { 1. } else { 0. };
velocity.linvel.x = (right - left) * 200.;
if climber.intersecting_climbables.is_empty() {
climber.climbing = false;
} else if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::KeyS) {
climber.climbing = true;
}
if climber.climbing {
let up = if input.pressed(KeyCode::KeyW) { 1. } else { 0. };
let down = if input.pressed(KeyCode::KeyS) { 1. } else { 0. };
velocity.linvel.y = (up - down) * 200.;
}
if input.just_pressed(KeyCode::Space) && (ground_detection.on_ground || climber.climbing) {
velocity.linvel.y = 500.;
climber.climbing = false;
}
}
}
pub struct PlayerPlugin;
impl Plugin for PlayerPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Update, player_movement)
.register_ldtk_entity::<PlayerBundle>("Player");
}
}