add reaction wheel sound

This commit is contained in:
yuni 2024-03-31 01:07:35 +01:00
parent 1f79610476
commit 7b04a41177
4 changed files with 38 additions and 1 deletions

View file

@ -125,6 +125,7 @@ cargo run --release
- https://pixabay.com/sound-effects/ducati-696-monster-33217 - https://pixabay.com/sound-effects/ducati-696-monster-33217
- https://pixabay.com/sound-effects/high-energy-humming-195612 - https://pixabay.com/sound-effects/high-energy-humming-195612
- https://pixabay.com/sound-effects/box-crash-106687 - https://pixabay.com/sound-effects/box-crash-106687
- https://pixabay.com/sound-effects/electric-fan-motor-blades-removed-13169
- Music: [Dead Space Style Ambient Music](https://pixabay.com/music/ambient-dead-space-style-ambient-music-184793) by [Sharvarian](https://www.fiverr.com/sharvarian) - Music: [Dead Space Style Ambient Music](https://pixabay.com/music/ambient-dead-space-style-ambient-music-184793) by [Sharvarian](https://www.fiverr.com/sharvarian)
- Star chart based on the [HYG Stellar database](https://github.com/astronexus/HYG-Database) - Star chart based on the [HYG Stellar database](https://github.com/astronexus/HYG-Database)
- Custom font Yupiter is based on: - Custom font Yupiter is based on:

Binary file not shown.

View file

@ -1,5 +1,5 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy::audio::PlaybackMode; use bevy::audio::{PlaybackMode, Volume};
use crate::settings; use crate::settings;
const ASSET_CLICK: &str = "sounds/click-button-140881-crop.ogg"; const ASSET_CLICK: &str = "sounds/click-button-140881-crop.ogg";
@ -14,6 +14,7 @@ const ASSET_ION: &str = "sounds/ion.ogg";
//const ASSET_WAKEUP: &str = "sounds/wakeup.ogg"; //const ASSET_WAKEUP: &str = "sounds/wakeup.ogg";
const ASSET_BIKESTART: &str = "sounds/bikestart.ogg"; const ASSET_BIKESTART: &str = "sounds/bikestart.ogg";
const ASSET_CRASH: &str = "sounds/crash.ogg"; const ASSET_CRASH: &str = "sounds/crash.ogg";
const ASSET_ELECTRICMOTOR: &str = "sounds/electricmotor.ogg";
pub struct AudioPlugin; pub struct AudioPlugin;
impl Plugin for AudioPlugin { impl Plugin for AudioPlugin {
@ -44,6 +45,7 @@ pub enum Sfx {
#[derive(Component)] pub struct ComponentThrusterSound; #[derive(Component)] pub struct ComponentThrusterSound;
#[derive(Component)] pub struct ComponentRocketSound; #[derive(Component)] pub struct ComponentRocketSound;
#[derive(Component)] pub struct ComponentIonSound; #[derive(Component)] pub struct ComponentIonSound;
#[derive(Component)] pub struct ComponentElectricMotorSound;
#[derive(Component)] struct SoundBGM(Handle<AudioSource>); #[derive(Component)] struct SoundBGM(Handle<AudioSource>);
#[derive(Resource)] pub struct SoundClick(Handle<AudioSource>); #[derive(Resource)] pub struct SoundClick(Handle<AudioSource>);
#[derive(Resource)] pub struct SoundSwitch(Handle<AudioSource>); #[derive(Resource)] pub struct SoundSwitch(Handle<AudioSource>);
@ -110,6 +112,18 @@ pub fn setup(
}, },
}, },
)); ));
commands.spawn((
ComponentElectricMotorSound,
AudioBundle {
source: asset_server.load(ASSET_ELECTRICMOTOR),
settings: PlaybackSettings {
mode: PlaybackMode::Loop,
volume: Volume::new(0.5),
paused: true,
..default()
},
},
));
commands.insert_resource(SoundClick(asset_server.load(ASSET_CLICK))); commands.insert_resource(SoundClick(asset_server.load(ASSET_CLICK)));
commands.insert_resource(SoundSwitch(asset_server.load(ASSET_SWITCH))); commands.insert_resource(SoundSwitch(asset_server.load(ASSET_SWITCH)));
commands.insert_resource(SoundIncomingMessage(asset_server.load(ASSET_INCOMING_MESSAGE))); commands.insert_resource(SoundIncomingMessage(asset_server.load(ASSET_INCOMING_MESSAGE)));

View file

@ -129,6 +129,7 @@ fn apply_input_to_player(
thruster_sound_controller: Query<&AudioSink, With<audio::ComponentThrusterSound>>, thruster_sound_controller: Query<&AudioSink, With<audio::ComponentThrusterSound>>,
rocket_sound_controller: Query<&AudioSink, With<audio::ComponentRocketSound>>, rocket_sound_controller: Query<&AudioSink, With<audio::ComponentRocketSound>>,
ion_sound_controller: Query<&AudioSink, With<audio::ComponentIonSound>>, ion_sound_controller: Query<&AudioSink, With<audio::ComponentIonSound>>,
electricmotor_sound_controller: Query<&AudioSink, With<audio::ComponentElectricMotorSound>>,
mut q_playercam: Query<( mut q_playercam: Query<(
&mut Transform, &mut Transform,
&mut actor::Engine, &mut actor::Engine,
@ -227,6 +228,7 @@ fn apply_input_to_player(
} }
// Handle mouse input and mouse-like key bindings // Handle mouse input and mouse-like key bindings
let mut play_reactionwheel_sound = false;
let mut mouse_delta = Vec2::ZERO; let mut mouse_delta = Vec2::ZERO;
let mut pitch_yaw_rot = Vec3::ZERO; let mut pitch_yaw_rot = Vec3::ZERO;
let mouseless_sensitivity = 8.0; let mouseless_sensitivity = 8.0;
@ -260,12 +262,32 @@ fn apply_input_to_player(
} }
} }
if pitch_yaw_rot.length_squared() > 0.0001 { if pitch_yaw_rot.length_squared() > 0.0001 {
play_reactionwheel_sound = true;
pitch_yaw_rot *= RADIANS_PER_DOT * settings.mouse_sensitivity; pitch_yaw_rot *= RADIANS_PER_DOT * settings.mouse_sensitivity;
player_transform.rotation *= Quat::from_euler(EulerRot::ZYX, player_transform.rotation *= Quat::from_euler(EulerRot::ZYX,
pitch_yaw_rot[2], pitch_yaw_rot[1], pitch_yaw_rot[0]).normalize(); pitch_yaw_rot[2], pitch_yaw_rot[1], pitch_yaw_rot[0]).normalize();
} }
// Play sound effects // Play sound effects
if let Ok(sink) = electricmotor_sound_controller.get_single() {
let volume = sink.volume();
let max = (pitch_yaw_rot.length() * 10.0).clamp(0.2, 1.0);
let max_speed = 1.0;
let rise = 0.07;
let fall = 0.15;
if play_reactionwheel_sound {
sink.set_volume((volume + rise).clamp(0.0, max));
sink.set_speed((volume + rise).clamp(0.2, max * max_speed));
sink.play()
} else {
if volume <= 0.01 {
sink.pause()
} else {
sink.set_volume((volume - fall).clamp(0.0, max));
sink.set_speed((volume - fall).clamp(0.2, max * max_speed));
}
}
}
if let Ok(sink) = thruster_sound_controller.get_single() { if let Ok(sink) = thruster_sound_controller.get_single() {
if play_thruster_sound && engine.engine_type == actor::EngineType::Monopropellant { if play_thruster_sound && engine.engine_type == actor::EngineType::Monopropellant {
sink.play() sink.play()