pickup hanlder

This commit is contained in:
LorrensP-2158466
2025-04-06 15:08:25 +02:00
parent c7ed475278
commit 4bd1f1343e
9 changed files with 216 additions and 139 deletions

View File

@@ -1,48 +1,69 @@
use bevy::prelude::*;
use bevy_rapier3d::prelude::{Collider, RigidBody};
use bevy::{prelude::*, reflect::DynamicTypePath};
use bevy_rapier3d::prelude::*;
use crate::{asset_loading::GltfAssets, GameState};
use crate::{GameState, asset_loading::GltfAssets, interaction::Interact};
pub fn map_plugin(app: &mut App) {
app.add_systems(OnEnter(GameState::Playing), spawn_level);
app.add_systems(
OnEnter(GameState::Playing),
(spawn_level, spawn_objects).chain(),
);
}
fn spawn_level(
mut commands: Commands,
models: Res<Assets<Gltf>>,
gltf_assets: Res<GltfAssets>
) {
fn spawn_level(mut commands: Commands, models: Res<Assets<Gltf>>, gltf_assets: Res<GltfAssets>) {
println!("LIBRARY: {:?}", gltf_assets.library);
let mesh_names = ["corner_inside", "corner_outside", "wall", "door", "round_door", "round_hole"];
let mesh_names = [
"corner_inside",
"corner_outside",
"wall",
"door",
"round_door",
"round_hole",
];
let shapes = mesh_names.map(|mesh_name| {
let collider: Vec<(Collider, Transform)> = match mesh_name {
"corner_inside" => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
"corner_outside" => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
"wall" => vec![
(Collider::cuboid(1.0, 1.0, 0.1), Transform::from_xyz(0.0, 0.5, -1.0))
],
"door" => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
"round_door" => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
"round_hole" => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
_ => vec![
(Collider::cuboid(1.0, 0.1, 1.0), Transform::from_xyz(0.0, 0.0, 0.0))
],
"corner_inside" => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
"corner_outside" => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
"wall" => vec![(
Collider::cuboid(1.0, 1.0, 0.1),
Transform::from_xyz(0.0, 0.5, -1.0),
)],
"door" => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
"round_door" => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
"round_hole" => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
_ => vec![(
Collider::cuboid(1.0, 0.1, 1.0),
Transform::from_xyz(0.0, 0.0, 0.0),
)],
};
let path = format!("meshes/library/space_{}.glb", mesh_name);
let handle = gltf_assets.library.get(&path).expect(&format!("Couldn't find {} in library", mesh_name));
let gltf = models.get(handle).expect(&format!("No model for {}", mesh_name));
let handle = gltf_assets
.library
.get(&path)
.expect(&format!("Couldn't find {} in library", mesh_name));
let gltf = models
.get(handle)
.expect(&format!("No model for {}", mesh_name));
let asset = gltf.default_scene.as_ref().expect(&format!("No scene in {}", mesh_name));
let asset = gltf
.default_scene
.as_ref()
.expect(&format!("No scene in {}", mesh_name));
(SceneRoot(asset.clone()), collider)
});
let [
@@ -51,35 +72,31 @@ fn spawn_level(
wall,
door,
round_door,
round_hole
round_hole,
] = shapes;
for i in 0..30 {
commands.spawn((
wall.0.clone(),
Transform::from_xyz(i as f32 * 2.0, 0.0, 0.0),
)).with_children(|parent| {
for ele in wall.1.clone() {
parent.spawn((
RigidBody::Fixed,
ele.0,
ele.1,
));
}
});
commands
.spawn((
wall.0.clone(),
Transform::from_xyz(i as f32 * 2.0, 0.0, 0.0),
))
.with_children(|parent| {
for ele in wall.1.clone() {
parent.spawn((RigidBody::Fixed, ele.0, ele.1));
}
});
commands.spawn((
wall.0.clone(),
Transform::from_xyz(i as f32 * 2.0, 0.0, 0.0)
.with_rotation(Quat::from_rotation_y(std::f32::consts::PI)),
)).with_children(|parent| {
for ele in wall.1.clone() {
parent.spawn((
RigidBody::Fixed,
ele.0,
ele.1,
));
}
});
commands
.spawn((
wall.0.clone(),
Transform::from_xyz(i as f32 * 2.0, 0.0, 0.0)
.with_rotation(Quat::from_rotation_y(std::f32::consts::PI)),
))
.with_children(|parent| {
for ele in wall.1.clone() {
parent.spawn((RigidBody::Fixed, ele.0, ele.1));
}
});
}
// huge floor
@@ -94,3 +111,60 @@ fn spawn_level(
Transform::from_xyz(-500.0, 3.0, -500.0),
));
}
fn spawn_objects(mut commands: Commands, models: Res<Assets<Gltf>>, gltf_assets: Res<GltfAssets>) {
// let hammer = gltf_assets
// .library
// .get("meshes/library/hammer.glb")
// .unwrap();
// let hammer = models.get(hammer).unwrap();
// let asset = hammer.default_scene.as_ref().unwrap();
// // hammer
// commands
// .spawn((
// Transform::from_xyz(0.0, 100.0, 0.0).with_scale(Vec3::splat(0.1)),
// Interact,
// RigidBody::Dynamic,
// SceneRoot(asset.clone()),
// ))
// .with_children(|parent| {
// parent
// .spawn(Collider::cuboid(0.8, 10f32, 0.8))
// .insert(Transform::from_xyz(0.0, -5.0, 0.0));
// parent
// .spawn(Collider::cuboid(1.0, 1.0, 4.5))
// .insert(Transform::from_xyz(0.0, 4.2, 1.0));
// });
// id card
let card = models.get(&gltf_assets.card).unwrap();
let asset = card.default_scene.as_ref().unwrap();
commands
.spawn((
Transform::from_xyz(0.0, 2.0, 2.0),
Interact,
RigidBody::Dynamic,
Name::new("Id Card"),
SceneRoot(asset.clone()),
))
.with_children(|parent| {
parent.spawn((
ColliderMassProperties::Mass(10.0),
Collider::cuboid(0.05, 0.05, 0.01),
Transform::from_rotation(Quat::from_euler(
EulerRot::XYZ,
-10.0f32.to_radians(), // X-axis rotation (tilt)
-5.0f32.to_radians(), // Y-axis rotation
10.0f32.to_radians(), // Z-axis rotation
)),
));
parent.spawn((
ActiveEvents::COLLISION_EVENTS,
Transform::default(),
Collider::ball(0.5), // Interaction radius
Sensor,
));
});
}