From 7281a46521f90c7ebe9f3ba14d965e60808c4ae2 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Thu, 13 Mar 2025 22:11:30 +0100 Subject: [PATCH] key mesh and squishy animation --- assets/models/key.glb | Bin 0 -> 115212 bytes src/keys.rs | 20 +++++--------------- src/main.rs | 2 ++ src/squish_animation.rs | 20 ++++++++++++++++++++ 4 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 assets/models/key.glb create mode 100644 src/squish_animation.rs diff --git a/assets/models/key.glb b/assets/models/key.glb new file mode 100644 index 0000000000000000000000000000000000000000..dff484ceeafc2680f88d0f0bd21942729a7cab00 GIT binary patch literal 115212 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 literal 0 HcmV?d00001 diff --git a/src/keys.rs b/src/keys.rs index 1b43f2e..024a969 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,4 +1,4 @@ -use crate::player::Player; +use crate::{billboards::Billboard, player::Player, squish_animation::SquishAnimation}; use avian3d::prelude::*; use bevy::prelude::*; use std::f32::consts::PI; @@ -18,19 +18,14 @@ pub fn plugin(app: &mut App) { app.add_observer(on_spawn); } -fn on_spawn( - trigger: Trigger, - mut commands: Commands, - mut meshes: ResMut>, - mut materials: ResMut>, -) { +fn on_spawn(trigger: Trigger, mut commands: Commands, asset_server: Res) { let KeySpawn(position) = trigger.event(); - let mesh = meshes.add(Cylinder::default()); - //TODO: randomize let spawn_dir = Quat::from_rotation_y(PI / 2.) * Vec3::new(0.5, 0.6, 0.).normalize(); + let mesh = asset_server.load(GltfAssetLabel::Scene(0).from_asset("models/key.glb")); + commands .spawn(( Name::new("key"), @@ -43,12 +38,7 @@ fn on_spawn( RigidBody::Dynamic, Restitution::new(0.6), )) - .with_child(( - Transform::from_scale(Vec3::new(2.2, 0.4, 2.2)) - .with_rotation(Quat::from_rotation_x(PI / 2.)), - Mesh3d(mesh), - MeshMaterial3d(materials.add(Color::srgb(0., 0., 0.9))), - )); + .with_child((Billboard, SquishAnimation(2.6), SceneRoot(mesh))); } fn collect_key( diff --git a/src/main.rs b/src/main.rs index fccda75..d32c648 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod npc; mod platforms; mod player; mod shooting; +mod squish_animation; mod tb_entities; use avian3d::PhysicsPlugins; @@ -84,6 +85,7 @@ fn main() { app.add_plugins(shooting::plugin); app.add_plugins(npc::plugin); app.add_plugins(keys::plugin); + app.add_plugins(squish_animation::plugin); app.insert_resource(AmbientLight { color: Color::WHITE, diff --git a/src/squish_animation.rs b/src/squish_animation.rs new file mode 100644 index 0000000..feae5ab --- /dev/null +++ b/src/squish_animation.rs @@ -0,0 +1,20 @@ +use bevy::prelude::*; +use ops::sin; + +#[derive(Component, Reflect)] +#[reflect(Component)] +pub struct SquishAnimation(pub f32); + +pub fn plugin(app: &mut App) { + app.add_systems(Update, update); +} + +fn update(mut query: Query<(&mut Transform, &SquishAnimation)>, time: Res