From 5d92c82db4ef88a2c46f173dca7beed06bee8547 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sat, 18 Mar 2023 12:31:53 +0100 Subject: [PATCH] Add basic game sounds --- .cargo/config.toml | 6 -- Cargo.lock | 115 ++++++++++++++++++++++++------------ Cargo.toml | 3 +- assets/sounds/blip.wav | Bin 0 -> 21190 bytes assets/sounds/collision.wav | Bin 0 -> 21190 bytes assets/sounds/tick.wav | Bin 0 -> 7178 bytes src/audio.rs | 12 ++++ src/main.rs | 10 ++-- src/snake.rs | 71 ++++++++++++++++++---- 9 files changed, 154 insertions(+), 63 deletions(-) create mode 100644 assets/sounds/blip.wav create mode 100644 assets/sounds/collision.wav create mode 100644 assets/sounds/tick.wav create mode 100644 src/audio.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 1908ce8..308270c 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -18,9 +18,3 @@ rustflags = ["-C", "link-arg=-fuse-ld=/opt/homebrew/bin/zld", "-Zshare-generics= [target.x86_64-pc-windows-msvc] linker = "rust-lld.exe" rustflags = ["-Zshare-generics=n"] - -# Optional: Uncommenting the following improves compile times, but reduces the amount of debug info to 'line number tables only' -# In most cases the gains are negligible, but if you are on macos and have slow compile times you should see significant gains. -#[profile.dev] -#debug = 1 - diff --git a/Cargo.lock b/Cargo.lock index 9c6cd82..f0cca2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -180,9 +180,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" [[package]] name = "approx" @@ -346,7 +346,7 @@ checksum = "fc47dfcdcb52182af97741c1582cc9b3bb4e82f0adacf4c3e78909d438cbfc8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -354,6 +354,7 @@ name = "bevy-snake" version = "0.1.0" dependencies = [ "bevy", + "bevy_asset_loader", "bevy_editor_pls", "bevy_tweening", "itertools", @@ -434,6 +435,28 @@ dependencies = [ "web-sys", ] +[[package]] +name = "bevy_asset_loader" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "118490c65031cecd6586e6b2cbd16f05bc161438dd0d30c42e307638eab7daba" +dependencies = [ + "anyhow", + "bevy", + "bevy_asset_loader_derive", +] + +[[package]] +name = "bevy_asset_loader_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac452d5861a4f9e69625b9a6d63a846dc9ee0e3c5ee32fe2d9c5b8cd59b916ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bevy_audio" version = "0.10.0" @@ -497,7 +520,7 @@ checksum = "cdf11701c01bf4dc7a3fac9f4547f3643d3db4cc1682af40c8c86e2f8734b617" dependencies = [ "bevy_macro_utils", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -544,7 +567,7 @@ dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -742,7 +765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f24ca3363292f1435641fbafd5c24ce362137dd7d69bee56dcaaa2bc1d512ffe" dependencies = [ "quote", - "syn", + "syn 1.0.109", "toml_edit", ] @@ -838,7 +861,7 @@ dependencies = [ "bit-set", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "uuid", ] @@ -897,7 +920,7 @@ dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1079,7 +1102,7 @@ checksum = "62a42e465c446800c57a5bf65b64f4fa1c1f3a74efc2a64a2a001e4a4f548a2e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1140,7 +1163,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 1.0.109", ] [[package]] @@ -1191,9 +1214,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" dependencies = [ "memchr", "once_cell", @@ -1224,7 +1247,7 @@ checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1512,7 +1535,7 @@ checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1629,7 +1652,7 @@ checksum = "ae489d58959f3c4cdd1250866a05acfb341469affe4fced71aff3ba228be1693" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1905,7 +1928,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2034,6 +2057,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hound" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" + [[package]] name = "idna" version = "0.3.0" @@ -2290,7 +2319,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2587,7 +2616,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2638,7 +2667,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3057,6 +3086,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdf1d4dea18dff2e9eb6dca123724f8b60ef44ad74a9ad283cdfe025df7e73fa" dependencies = [ "cpal", + "hound", "lewton", ] @@ -3128,22 +3158,22 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.156" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +checksum = "707de5fcf5df2b5788fca98dd7eab490bc2fd9b7ef1404defc462833b83f25ca" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.156" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +checksum = "78997f4555c22a7971214540c4a661291970619afd56de19f77e0de86296e1e5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.0", ] [[package]] @@ -3258,10 +3288,21 @@ dependencies = [ ] [[package]] -name = "sysinfo" -version = "0.28.2" +name = "syn" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e847e2de7a137c8c2cede5095872dbb00f4f9bf34d061347e36b43322acd56" +checksum = "4cff13bb1732bccfe3b246f3fdb09edfd51c01d6f5299b7ccd9457c2e4e37774" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sysinfo" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f69e0d827cce279e61c2f3399eb789271a8f136d8245edef70f06e3c9601a670" dependencies = [ "cfg-if", "core-foundation-sys 0.8.3", @@ -3293,22 +3334,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.0", ] [[package]] @@ -3384,7 +3425,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3574,7 +3615,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -3608,7 +3649,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3904,7 +3945,7 @@ checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3915,7 +3956,7 @@ checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1f00402..0db6928 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,10 +9,11 @@ rand = "0.8.5" bevy_editor_pls = "0.3.0" bevy_tweening = "0.7.0" leafwing-input-manager = "0.9.0" +bevy_asset_loader = "0.15.0" [dependencies.bevy] version = "0.10" -features = ["wayland"] +features = ["wayland", "wav"] # [profile.dev.package."*"] # opt-level = 3 diff --git a/assets/sounds/blip.wav b/assets/sounds/blip.wav new file mode 100644 index 0000000000000000000000000000000000000000..9423f532cf1c74862e48c4f64efccf317f935cc5 GIT binary patch literal 21190 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 L?ZE$=JMe!1@aDAj literal 0 HcmV?d00001 diff --git a/assets/sounds/collision.wav b/assets/sounds/collision.wav new file mode 100644 index 0000000000000000000000000000000000000000..8abf91dfadadf0f5957aaa20d5fb394e72b9e448 GIT binary patch literal 21190 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 CB_2Tl literal 0 HcmV?d00001 diff --git a/assets/sounds/tick.wav b/assets/sounds/tick.wav new file mode 100644 index 0000000000000000000000000000000000000000..af4716561971bc115e7f1ed2eb1168023612725d GIT binary patch literal 7178 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 literal 0 HcmV?d00001 diff --git a/src/audio.rs b/src/audio.rs new file mode 100644 index 0000000..98d3919 --- /dev/null +++ b/src/audio.rs @@ -0,0 +1,12 @@ +use bevy::prelude::*; +use bevy_asset_loader::prelude::*; + +#[derive(AssetCollection, Resource)] +pub struct Assets { + #[asset(path = "sounds/collision.wav")] + pub collision: Handle, + #[asset(path = "sounds/tick.wav")] + pub tick: Handle, + #[asset(path = "sounds/blip.wav")] + pub blip: Handle, +} diff --git a/src/main.rs b/src/main.rs index 6b67c40..a2883f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,12 +6,14 @@ use crate::{ ui::UiPlugin, }; use bevy::{prelude::*, render::camera::ScalingMode, window::WindowResolution}; +use bevy_asset_loader::prelude::*; use bevy_tweening::TweeningPlugin; use std::time::Duration; #[cfg(debug_assertions)] use bevy_editor_pls::prelude::*; +mod audio; mod canvas; mod fruit; mod grid; @@ -22,7 +24,6 @@ const ASPECT_RATIO: f32 = 16. / 9.; const WINDOW_WIDTH: f32 = WINDOW_HEIGHT * ASPECT_RATIO; const WINDOW_HEIGHT: f32 = 720.; const TICK_PERIOD: Duration = Duration::from_millis(125); -const CLEAR_COLOR: Color = Color::rgba(0.15, 0.15, 0.15, 1.0); #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)] enum GameState { @@ -38,7 +39,7 @@ struct Score(u32); fn main() { let mut app = App::new(); - app.insert_resource(ClearColor(CLEAR_COLOR)) + app.insert_resource(ClearColor(Color::BLACK)) .insert_resource(FixedTime::new(TICK_PERIOD)) .insert_resource(Score(0)) .add_plugins(DefaultPlugins.set(WindowPlugin { @@ -50,6 +51,7 @@ fn main() { }), ..Default::default() })) + .init_collection::() .add_state::() .add_plugin(TweeningPlugin) .add_plugin(SnakePlugin) @@ -81,10 +83,6 @@ fn setup_system(mut commands: Commands) { }, ..Default::default() }, - camera: Camera { - hdr: true, - ..Default::default() - }, ..Default::default() }) .insert(Name::new("Orthographic Camera")); diff --git a/src/snake.rs b/src/snake.rs index a654a28..cab08a4 100644 --- a/src/snake.rs +++ b/src/snake.rs @@ -3,7 +3,7 @@ mod bulge; mod direction; mod movement; -use crate::{fruit, grid, GameState}; +use crate::{audio, fruit, grid, GameState}; use bevy::prelude::*; use direction::Direction; use itertools::Itertools; @@ -57,7 +57,24 @@ impl Plugin for SnakePlugin { .in_schedule(CoreSchedule::FixedUpdate) .in_set(SystemSet::CollisionDetection) .in_set(OnUpdate(GameState::InGame)) - .after(collision_system), + .after(collision_system) + .run_if(about_to_collide), + ) + .add_system( + collision_sound_system + .run_if(in_state(GameState::InGame)) + .run_if(about_to_collide), + ) + .add_system( + tick_sound_system + .in_schedule(CoreSchedule::FixedUpdate) + .run_if(in_state(GameState::InGame)) + .run_if(not(about_to_collide)), + ) + .add_system( + blip_sound_system + .in_schedule(CoreSchedule::FixedUpdate) + .run_if(in_state(GameState::InGame)), ) .add_system(direction::start_game_system.in_set(OnUpdate(GameState::Begin))) .add_system(direction::change_direction_system) @@ -104,11 +121,18 @@ struct Collision { pub struct AddTailEvent; -fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate) -> Entity { +fn create_snake_segment( + commands: &mut Commands, + grid_position: grid::Coordinate, + segment_number: u32, +) -> Entity { + let mut color = Color::RED; + color *= 0.99f32.powi(segment_number as _); + commands .spawn(SpriteBundle { sprite: Sprite { - color: Color::RED, + color, custom_size: Some(Vec2::splat(grid::SEGMENT_SIZE) * 0.9), ..Default::default() }, @@ -122,7 +146,8 @@ fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate } fn setup_snake_system(mut commands: Commands) { - let snake_head = create_snake_segment(&mut commands, grid::Coordinate::splat(grid::SIZE / 2)); + let snake_head = + create_snake_segment(&mut commands, grid::Coordinate::splat(grid::SIZE / 2), 0); commands .entity(snake_head) @@ -164,11 +189,14 @@ fn add_tail_system( mut tail_event_reader: EventReader, ) { for _ in tail_event_reader.iter() { - let segment = - create_snake_segment(&mut commands, grid::Coordinate::splat(grid::Index::MIN / 2)); - let (snake_entity, mut segments) = snake_query.single_mut(); + let segment = create_snake_segment( + &mut commands, + grid::Coordinate::splat(grid::Index::MIN / 2), + segments.0.len() as _, + ); + segments.0.push(segment); commands @@ -232,12 +260,29 @@ fn collision_system( } } -fn game_over_system( - query: Query<&Collision, With>, - mut next_state: ResMut>, +fn about_to_collide(query: Query<&Collision, With>) -> bool { + query.get_single().unwrap().about_to_collide +} + +fn game_over_system(mut next_state: ResMut>) { + next_state.set(GameState::End); +} + +fn collision_sound_system(audio: Res