flashlight sound and animation

This commit is contained in:
Back777space
2025-04-06 15:41:22 +02:00
parent 99041827d4
commit f538c597f7
8 changed files with 246 additions and 36 deletions

View File

@@ -3,31 +3,35 @@ use bevy::{prelude::*, utils::HashMap};
use crate::GameState;
use bevy_asset_loader::prelude::*;
// use bevy_egui::{EguiContexts, egui, egui::ProgressBar};
// use bevy_kira_audio::AudioSource;
use bevy_kira_audio::{AudioPlugin, AudioSource};
// use iyes_progress::{ProgressCounter, ProgressPlugin};
/// Loads resources and assets for the game.
/// See assets/main.assets.ron for the actual paths used.
pub(super) fn plugin(app: &mut App) {
app.add_loading_state(
LoadingState::new(GameState::Loading)
.continue_to_state(GameState::Menu)
.with_dynamic_assets_file::<StandardDynamicAssetCollection>("main.assets.ron")
.load_collection::<ImageAssets>()
.load_collection::<FlashlightAssets>()
.load_collection::<GltfAssets>(),
// .load_collection::<AudioAssets>()
// .load_collection::<TextureAssets>()
// .load_collection::<GrassAssets>()
// .load_collection::<ConfigAssets>(),
);
app.add_plugins(AudioPlugin)
.add_loading_state(
LoadingState::new(GameState::Loading)
.continue_to_state(GameState::Menu)
.with_dynamic_assets_file::<StandardDynamicAssetCollection>("main.assets.ron")
.load_collection::<ImageAssets>()
.load_collection::<FlashlightAssets>()
.load_collection::<GltfAssets>()
.load_collection::<AudioAssets>(),
// .load_collection::<TextureAssets>()
// .load_collection::<GrassAssets>()
// .load_collection::<ConfigAssets>(),
);
}
// the following asset collections will be loaded during the State `GameState::InitialLoading`
// when done loading, they will be inserted as resources (see <https://github.com/NiklasEi/bevy_asset_loader>)
#[derive(AssetCollection, Resource, Clone)]
pub(crate) struct AudioAssets {}
pub(crate) struct AudioAssets {
#[asset(key = "flashlight_click")]
pub(crate) flash_click: Handle<AudioSource>,
}
#[derive(AssetCollection, Resource, Clone)]
pub(crate) struct GltfAssets {
@@ -54,4 +58,6 @@ pub(crate) struct ImageAssets {
pub(crate) struct FlashlightAssets {
#[asset(key = "flash_hold_4")]
pub(crate) flash_hold_4: Handle<Image>,
#[asset(key = "flash_hold_4_pressed")]
pub(crate) flash_hold_4_pressed: Handle<Image>,
}

View File

@@ -1,5 +1,5 @@
use asset_loading::ImageAssets;
use bevy::{prelude::*};
use bevy::prelude::*;
use bevy_rapier3d::prelude::*;
mod asset_loading;

View File

@@ -2,11 +2,12 @@
use bevy::{
input::mouse::AccumulatedMouseMotion, prelude::*, render::view::RenderLayers, window::{PrimaryWindow, WindowResized}
};
use bevy_kira_audio::{Audio, AudioControl};
use bevy_rapier3d::prelude::*;
pub mod toolbar;
use crate::{asset_loading::FlashlightAssets, GameState};
use crate::{asset_loading::{AudioAssets, FlashlightAssets}, GameState};
#[derive(Debug, Component, Default)]
pub struct Player {
@@ -54,6 +55,22 @@ pub struct BaseTransform(pub Transform);
#[derive(Debug, Component)]
pub struct Flashlight;
#[derive(Component)]
pub struct FlashlightButtonAnimation {
pub timer: Timer,
pub is_pressed: bool,
}
impl Default for FlashlightButtonAnimation {
fn default() -> Self {
Self {
timer: Timer::from_seconds(0.20, TimerMode::Once),
is_pressed: false,
}
}
}
pub fn plugin(app: &mut App) {
app.add_plugins(toolbar::plugin)
.add_systems(OnEnter(GameState::Playing), (init_player, hide_cursor))
@@ -65,7 +82,7 @@ pub fn plugin(app: &mut App) {
apply_head_bob,
on_resize_system,
handle_flashlight,
// handle_flashlight_movement,
update_flashlight_button_animation,
).run_if(in_state(GameState::Playing)),
)
.add_systems(
@@ -130,6 +147,7 @@ pub fn init_player(
transform.0.clone(),
transform,
RenderLayers::layer(STATIC_LAYER),
FlashlightButtonAnimation::default(),
));
// feitelijke pitslamp
@@ -355,6 +373,9 @@ pub fn apply_head_bob(
pub fn handle_flashlight(
player_query: Query<&PlayerAction, With<Player>>,
mut flashlight_query: Query<&mut SpotLight, With<Flashlight>>,
mut flashlight_sprite_query: Query<&mut FlashlightButtonAnimation>,
audio_assets: Res<AudioAssets>,
audio: Res<Audio>,
) {
let Ok(action) = player_query.get_single() else {
return;
@@ -362,12 +383,35 @@ pub fn handle_flashlight(
if *action != PlayerAction::ToggleFlashlight {
return;
}
if let Ok(mut animation) = flashlight_sprite_query.get_single_mut() {
animation.is_pressed = true;
animation.timer.reset();
}
if let Ok(mut spotlight) = flashlight_query.get_single_mut() {
audio.play(audio_assets.flash_click.clone());
spotlight.intensity = if spotlight.intensity > 0.0 {
0.0
} else {
300_000.0
};
println!("Flashlight {}", if spotlight.intensity > 0.0 { "on" } else { "off" });
}
}
pub fn update_flashlight_button_animation(
time: Res<Time>,
mut query: Query<(&mut FlashlightButtonAnimation, &mut Sprite)>,
flashlights: Res<FlashlightAssets>,
) {
for (mut animation, mut image) in query.iter_mut() {
if animation.is_pressed {
animation.timer.tick(time.delta());
if animation.timer.finished() {
*image = Sprite::from_image(flashlights.flash_hold_4.clone());
animation.is_pressed = false;
} else {
*image = Sprite::from_image(flashlights.flash_hold_4_pressed.clone());
}
}
}
}