secret heads and collecting sound

This commit is contained in:
2025-05-22 22:42:12 +02:00
parent 6a82d294de
commit 97929504cc
6 changed files with 68 additions and 2 deletions

View File

@@ -1,7 +1,7 @@
use crate::{
GameState, billboards::Billboard, global_observer, loading_assets::GameAssets,
physics_layers::GameLayer, player::Player, sounds::PlaySound,
squish_animation::SquishAnimation,
squish_animation::SquishAnimation, tb_entities::SecretHead,
};
use avian3d::prelude::*;
use bevy::prelude::*;
@@ -14,15 +14,50 @@ pub struct HeadDrops(pub Vec3, pub usize);
#[reflect(Component)]
struct HeadDrop(pub usize);
#[derive(Component, Reflect)]
#[reflect(Component)]
struct SecretHeadMarker;
#[derive(Event, Reflect)]
pub struct HeadCollected(pub usize);
pub fn plugin(app: &mut App) {
app.add_systems(Update, collect_head.run_if(in_state(GameState::Playing)));
app.add_systems(OnEnter(GameState::Playing), spawn);
global_observer!(app, on_head_drop);
}
fn spawn(
mut commands: Commands,
query: Query<(Entity, &GlobalTransform, &SecretHead)>,
assets: Res<GameAssets>,
) {
for (e, t, head) in query {
commands
.spawn((
Name::new("headdrop"),
SecretHeadMarker,
HeadDrop(head.head_id),
Transform::from_translation(t.translation() + Vec3::new(0., 2., 0.)),
Visibility::default(),
Collider::sphere(1.5),
LockedAxes::ROTATION_LOCKED,
RigidBody::Dynamic,
CollisionLayers::new(LayerMask(GameLayer::Collectibles.to_bits()), LayerMask::ALL),
CollisionEventsEnabled,
Restitution::new(0.6),
))
.with_child((
Billboard,
SquishAnimation(2.6),
SceneRoot(assets.mesh_head_drop.clone()),
));
commands.entity(e).despawn();
}
}
fn on_head_drop(trigger: Trigger<HeadDrops>, mut commands: Commands, assets: Res<GameAssets>) {
let HeadDrops(position, id) = trigger.event();
@@ -57,6 +92,7 @@ fn collect_head(
mut collision_event_reader: EventReader<CollisionStarted>,
query_player: Query<&Player>,
query_collectable: Query<&HeadDrop>,
query_secret: Query<&SecretHeadMarker>,
) {
for CollisionStarted(e1, e2) in collision_event_reader.read() {
let collectable = if query_player.contains(*e1) && query_collectable.contains(*e2) {
@@ -69,7 +105,13 @@ fn collect_head(
let key = query_collectable.get(collectable).unwrap();
commands.trigger(PlaySound::HeadCollect);
let is_secret = query_secret.contains(collectable);
if is_secret {
commands.trigger(PlaySound::SecretHeadCollect);
} else {
commands.trigger(PlaySound::HeadCollect);
}
commands.trigger(HeadCollected(key.0));
commands.entity(collectable).despawn();
}