game is now independent of hexodsp/cpal

This commit is contained in:
Nixon 2022-08-28 15:28:08 +08:00
parent ccf86e23e4
commit 450e448649
18 changed files with 85 additions and 230 deletions

173
Cargo.lock generated
View file

@ -899,7 +899,7 @@ dependencies = [
"bevy_input",
"bevy_math",
"bevy_utils",
"raw-window-handle 0.4.3",
"raw-window-handle",
"web-sys",
]
@ -917,7 +917,7 @@ dependencies = [
"bevy_utils",
"bevy_window",
"crossbeam-channel",
"raw-window-handle 0.4.3",
"raw-window-handle",
"wasm-bindgen",
"web-sys",
"winit",
@ -932,9 +932,7 @@ dependencies = [
"bevy_common_assets",
"bevy_mod_picking",
"bevy_rapier2d",
"cpal 0.14.0",
"crossbeam-channel",
"hexodsp",
"rand",
"rand_distr",
"rapier2d",
@ -1312,32 +1310,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "cpal"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d466b47cf0ea4100186a7c12d7d0166813dda7cf648553554c9c39c6324841b"
dependencies = [
"alsa",
"core-foundation-sys 0.8.3",
"coreaudio-rs",
"jni",
"js-sys",
"libc",
"mach",
"ndk 0.7.0",
"ndk-context",
"nix 0.23.1",
"oboe",
"once_cell",
"parking_lot 0.12.1",
"stdweb",
"thiserror",
"wasm-bindgen",
"web-sys",
"windows",
]
[[package]]
name = "crc32fast"
version = "1.3.2"
@ -1960,26 +1932,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
[[package]]
name = "hexodsp"
version = "0.2.0"
source = "git+https://github.com/WeirdConstructor/HexoDSP#be4e9232cc05b96588b156d1c9f995f7eda41ec0"
dependencies = [
"hound",
"lazy_static",
"ringbuf",
"serde",
"serde_json",
"synfx-dsp",
"triple_buffer",
]
[[package]]
name = "hound"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a164bb2ceaeff4f42542bdb847c41517c78a60f5649671b2a07312b6e117549"
[[package]]
name = "ident_case"
version = "1.0.1"
@ -2440,20 +2392,6 @@ dependencies = [
"thiserror",
]
[[package]]
name = "ndk"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
dependencies = [
"bitflags",
"jni-sys",
"ndk-sys 0.4.0",
"num_enum",
"raw-window-handle 0.5.0",
"thiserror",
]
[[package]]
name = "ndk-context"
version = "0.1.1"
@ -2519,15 +2457,6 @@ dependencies = [
"jni-sys",
]
[[package]]
name = "ndk-sys"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21d83ec9c63ec5bf950200a8e508bdad6659972187b625469f58ef8c08e29046"
dependencies = [
"jni-sys",
]
[[package]]
name = "nix"
version = "0.22.3"
@ -3071,15 +3000,6 @@ dependencies = [
"cty",
]
[[package]]
name = "raw-window-handle"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a"
dependencies = [
"cty",
]
[[package]]
name = "rawpointer"
version = "0.2.1"
@ -3133,15 +3053,6 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157"
[[package]]
name = "ringbuf"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f65af18d50f789e74aaf23bbb3f65dcd22a3cb6e029b5bced149f6bd57c5c2a2"
dependencies = [
"cache-padded",
]
[[package]]
name = "robust"
version = "0.2.3"
@ -3154,7 +3065,7 @@ version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e"
dependencies = [
"cpal 0.13.5",
"cpal",
"lewton",
]
@ -3365,14 +3276,6 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "synfx-dsp"
version = "0.5.3"
source = "git+https://github.com/WeirdConstructor/synfx-dsp#3334a91ee48c009707c0147434a3fc14a929c079"
dependencies = [
"num-traits",
]
[[package]]
name = "taffy"
version = "0.1.0"
@ -3538,15 +3441,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "triple_buffer"
version = "5.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "803966e5a8397a70d3d8111afa1597ba8381346d7de4720e9f539471d371a1a3"
dependencies = [
"cache-padded",
]
[[package]]
name = "ttf-parser"
version = "0.15.2"
@ -3761,7 +3655,7 @@ dependencies = [
"log",
"naga",
"parking_lot 0.11.2",
"raw-window-handle 0.4.3",
"raw-window-handle",
"smallvec",
"wasm-bindgen",
"wasm-bindgen-futures",
@ -3787,7 +3681,7 @@ dependencies = [
"naga",
"parking_lot 0.11.2",
"profiling",
"raw-window-handle 0.4.3",
"raw-window-handle",
"smallvec",
"thiserror",
"web-sys",
@ -3824,7 +3718,7 @@ dependencies = [
"parking_lot 0.11.2",
"profiling",
"range-alloc",
"raw-window-handle 0.4.3",
"raw-window-handle",
"renderdoc-sys",
"thiserror",
"wasm-bindgen",
@ -3897,30 +3791,17 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647"
dependencies = [
"windows_aarch64_msvc 0.37.0",
"windows_i686_gnu 0.37.0",
"windows_i686_msvc 0.37.0",
"windows_x86_64_gnu 0.37.0",
"windows_x86_64_msvc 0.37.0",
]
[[package]]
name = "windows-sys"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
dependencies = [
"windows_aarch64_msvc 0.36.1",
"windows_i686_gnu 0.36.1",
"windows_i686_msvc 0.36.1",
"windows_x86_64_gnu 0.36.1",
"windows_x86_64_msvc 0.36.1",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_msvc",
]
[[package]]
@ -3929,60 +3810,30 @@ version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
[[package]]
name = "windows_aarch64_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a"
[[package]]
name = "windows_i686_gnu"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
[[package]]
name = "windows_i686_gnu"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1"
[[package]]
name = "windows_i686_msvc"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
[[package]]
name = "windows_i686_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c"
[[package]]
name = "windows_x86_64_gnu"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
[[package]]
name = "windows_x86_64_gnu"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
[[package]]
name = "windows_x86_64_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d"
[[package]]
name = "winit"
version = "0.26.1"
@ -4006,7 +3857,7 @@ dependencies = [
"objc",
"parking_lot 0.11.2",
"percent-encoding",
"raw-window-handle 0.4.3",
"raw-window-handle",
"wasm-bindgen",
"web-sys",
"winapi",

View file

@ -18,13 +18,13 @@ serde = { version = "1.0.144", features = ["derive"] }
[target."cfg(not(target_arch = \"wasm32\"))".dependencies]
bevy-inspector-egui = "0.12.1"
bevy_mod_picking = "0.9.0"
cpal = "0.14.0"
hexodsp = { git = "https://github.com/WeirdConstructor/HexoDSP", default-features = false }
# cpal = "0.14.0"
# hexodsp = { git = "https://github.com/WeirdConstructor/HexoDSP", default-features = false }
serde_json = "1.0.85"
ticktock = "0.8.0"
[target."cfg(target_arch = \"wasm32\")".dependencies]
cpal = { version = "0.14.0", features = ["wasm-bindgen"] }
# cpal = { version = "0.14.0", features = ["wasm-bindgen"] }
[profile.dev.package."*"]
opt-level = 3

BIN
assets/sound/notes.flp Normal file

Binary file not shown.

BIN
assets/sound/notes/a5.ogg Normal file

Binary file not shown.

BIN
assets/sound/notes/cs6.ogg Normal file

Binary file not shown.

BIN
assets/sound/notes/e6.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -6,8 +6,8 @@
</head>
<body>
<script type="module">
import init from './target/bevyjam.js'
init()
import init from './target/bevyjam.js'
init()
</script>
</body>
</html>

View file

@ -1,5 +1,6 @@
// https://github.com/WeirdConstructor/HexoDSP/blob/master/examples/cpal_demo_node_api.rs
// use bevy::{prelude::*, asset::HandleId};
use crate::game::AudioMsg;
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};

49
src/audio_system.rs Normal file
View file

@ -0,0 +1,49 @@
use bevy::prelude::*;
pub struct AudioSystemPlugin;
impl Plugin for AudioSystemPlugin {
fn build(&self, app: &mut App) {
app
.init_resource::<AudioAssets>()
.add_startup_system(load_audio);
}
}
#[derive(Default)]
pub struct AudioAssets {
pub notes: [Handle<AudioSource>; 3],
pub reverb_notes: [Handle<AudioSource>; 3],
pub warp_notes: [Handle<AudioSource>; 3],
}
pub fn play_audio(
audio_set: &[Handle<AudioSource>; 3],
audio: &Res<Audio>,
color: Vec4,
volume: f32,
) {
for i in 0 .. 3 {
audio.play_with_settings(
audio_set[i].clone(),
PlaybackSettings::ONCE.with_volume(color[i] * volume)
);
}
}
fn load_audio(
mut audio_assets: ResMut<AudioAssets>,
asset_server: Res<AssetServer>,
) {
audio_assets.notes[0] = asset_server.load::<AudioSource, &str>("sound/notes/a5.ogg");
audio_assets.notes[1] = asset_server.load::<AudioSource, &str>("sound/notes/cs6.ogg");
audio_assets.notes[2] = asset_server.load::<AudioSource, &str>("sound/notes/e6.ogg");
audio_assets.reverb_notes[0] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/a5.ogg");
audio_assets.reverb_notes[1] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/cs6.ogg");
audio_assets.reverb_notes[2] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/e6.ogg");
audio_assets.warp_notes[0] = asset_server.load::<AudioSource, &str>("sound/warp_notes/a5.ogg");
audio_assets.warp_notes[1] = asset_server.load::<AudioSource, &str>("sound/warp_notes/cs6.ogg");
audio_assets.warp_notes[2] = asset_server.load::<AudioSource, &str>("sound/warp_notes/e6.ogg");
}

View file

@ -3,7 +3,7 @@
pub use crate::filters::*;
use crate::AppState;
use crate::{AppState, audio_system};
use bevy::{
ecs::system::EntityCommands,
@ -15,13 +15,6 @@ use bevy_rapier2d::prelude::*;
use rapier2d::geometry::CollisionEventFlags;
use std::collections::BTreeSet;
pub enum AudioMsg {
Color([f32; 3]),
Fusion,
Jump,
Switch,
}
pub struct FirstLevel(pub LevelId);
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
@ -153,7 +146,6 @@ pub fn spawn_characters<I: IntoIterator<Item = (Transform, Color)>>(
commands: &mut Commands,
character_meshes: &Res<CharacterMeshes>,
materials: &mut ResMut<Assets<ColorMaterial>>,
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
character_list: &mut ResMut<CharacterList>,
characters: I,
@ -166,7 +158,6 @@ pub fn spawn_characters<I: IntoIterator<Item = (Transform, Color)>>(
commands,
character_meshes,
materials,
audio,
character_list,
{
let mut new_transform: Transform = transform;
@ -184,7 +175,6 @@ pub fn spawn_character(
commands: &mut Commands,
character_meshes: &Res<CharacterMeshes>,
materials: &mut ResMut<Assets<ColorMaterial>>,
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
character_list: &mut ResMut<CharacterList>,
mut transform: Transform,
color: Color,
@ -229,9 +219,6 @@ pub fn spawn_character(
if is_player {
entity_commands.insert(Player);
audio
.send(AudioMsg::Color([color.r(), color.g(), color.b()]))
.ok();
}
}
@ -315,8 +302,9 @@ fn char_char_collision_event_system(
mut character_list: ResMut<CharacterList>,
mut app_state: ResMut<State<AppState>>,
character_meshes: Res<CharacterMeshes>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
mut materials: ResMut<Assets<ColorMaterial>>,
audio_assets: Res<audio_system::AudioAssets>,
audio: Res<Audio>,
) {
for collision_event in collision_events.iter() {
if let CollisionEvent::Started(e1, e2, _flags) = collision_event {
@ -342,7 +330,6 @@ fn char_char_collision_event_system(
&mut commands,
&character_meshes,
&mut materials,
&audio,
&mut character_list,
if c1_player.is_some() {
*c1_transform
@ -357,7 +344,7 @@ fn char_char_collision_event_system(
c1_player.is_some() || c2_player.is_some(),
);
audio.send(AudioMsg::Fusion).ok();
audio_system::play_audio(&audio_assets.warp_notes, &audio, new_color.into(), 1.0);
}
}
}
@ -418,7 +405,6 @@ fn collision_event_system(
)>,
pass_through_filter_query: Query<&PassThroughFilter>,
melty_query: Query<&Melty>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
) {
for collision_event in collision_events.iter() {
if let CollisionEvent::Started(e1, e2, flags) = collision_event {
@ -437,25 +423,15 @@ fn collision_event_system(
}
}
} else if *flags == CollisionEventFlags::SENSOR {
if let (Ok((mut c_color, _c_transform, mut c_material, c_player)), Ok(filter)) = (
if let (Ok((mut c_color, _c_transform, mut c_material, _c_player)), Ok(filter)) = (
character_query.get_mut(*e1),
pass_through_filter_query.get(*e2),
) {
c_color.0 = filter.apply(c_color.0);
*c_material = materials.add(ColorMaterial::from(c_color.0));
if c_player.is_some() {
audio
.send(AudioMsg::Color([
c_color.0.r(),
c_color.0.g(),
c_color.0.b(),
]))
.ok();
audio.send(AudioMsg::Switch).ok();
}
} else if let (
Ok((mut c_color, _c_transform, mut c_material, c_player)),
Ok((mut c_color, _c_transform, mut c_material, _c_player)),
Ok(filter),
) = (
character_query.get_mut(*e2),
@ -463,17 +439,6 @@ fn collision_event_system(
) {
c_color.0 = filter.apply(c_color.0);
*c_material = materials.add(ColorMaterial::from(c_color.0));
if c_player.is_some() {
audio
.send(AudioMsg::Color([
c_color.0.r(),
c_color.0.g(),
c_color.0.b(),
]))
.ok();
audio.send(AudioMsg::Switch).ok();
}
}
}
}
@ -485,8 +450,9 @@ fn change_character_system(
keyboard_input: Res<Input<KeyCode>>,
characters: Query<(Entity, &CharacterColor, Option<&Player>)>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
character_list: Res<CharacterList>,
audio_assets: Res<audio_system::AudioAssets>,
audio: Res<Audio>,
) {
if !keyboard_input.just_pressed(KeyCode::Tab) {
return;
@ -506,10 +472,7 @@ fn change_character_system(
{
commands.entity(*new_player_entity).insert(Player);
if let Ok((_entity, color, _player)) = characters.get(*new_player_entity) {
audio
.send(AudioMsg::Color([color.0.r(), color.0.g(), color.0.b()]))
.ok();
audio.send(AudioMsg::Switch).ok();
audio_system::play_audio(&audio_assets.reverb_notes, &audio, color.0.into(), 1.0);
}
}
}
@ -517,21 +480,22 @@ fn change_character_system(
fn player_movement_system(
keyboard_input: Res<Input<KeyCode>>,
mut characters: Query<(&mut Velocity, &Children), With<Player>>,
mut characters: Query<(&mut Velocity, &Children, &CharacterColor), With<Player>>,
mut platform_count_query: Query<&mut PlatformCount>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
audio_assets: Res<audio_system::AudioAssets>,
audio: Res<Audio>,
) {
let right_pressed: bool =
keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::D);
let left_pressed: bool =
keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::A);
for (mut velocity, children) in characters.iter_mut() {
for (mut velocity, children, color) in characters.iter_mut() {
velocity.linvel.x = 200. * (right_pressed as i8 - left_pressed as i8) as f32;
let mut platform_count: Mut<PlatformCount> = platform_count_query.get_mut(children[0]).unwrap();
if keyboard_input.just_pressed(KeyCode::Space) && platform_count.is_landed() {
audio.send(AudioMsg::Jump).ok();
audio_system::play_audio(&audio_assets.notes, &audio, color.0.into(), 0.5);
velocity.linvel.y = 700.;
platform_count.reset();
}

View file

@ -36,7 +36,6 @@ pub fn post_setup_level(
current_level: Res<CurrentLevel>,
mut level_startup_event: EventReader<LevelStartupEvent>,
asset_server: Res<AssetServer>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
mut character_list: ResMut<CharacterList>,
stored_levels_assets: Res<Assets<StoredLevels>>,
stored_levels_handle: Res<Handle<StoredLevels>>,
@ -55,7 +54,6 @@ pub fn post_setup_level(
&mut meshes,
&mut materials,
&asset_server,
&audio,
&mut character_list,
stored_level,
);
@ -70,7 +68,6 @@ pub fn spawn_stored_level(
meshes: &mut ResMut<Assets<Mesh>>,
materials: &mut ResMut<Assets<ColorMaterial>>,
asset_server: &Res<AssetServer>,
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
character_list: &mut ResMut<CharacterList>,
stored_level: &StoredLevel,
@ -91,7 +88,6 @@ pub fn spawn_stored_level(
commands,
character_meshes,
materials,
audio,
character_list,
stored_level.characters.iter().map(|character| {
(

View file

@ -1,14 +1,14 @@
#![allow(clippy::too_many_arguments)]
#[cfg(not(target_arch = "wasm32"))]
mod audio;
#[cfg(not(target_arch = "wasm32"))]
mod editor;
mod filters;
mod game;
mod levels;
mod menu;
mod particle_effect;
mod audio_system;
use bevy::{
asset::{Asset, HandleId, LoadState},
@ -39,12 +39,6 @@ impl LoadingAssets {
}
fn main() {
let (audio_event_sender, audio_event_receiver) =
crossbeam_channel::bounded::<game::AudioMsg>(512);
#[cfg(not(target_arch = "wasm32"))]
std::thread::spawn(move || audio::setup(audio_event_receiver));
#[cfg(not(target_arch = "wasm32"))]
let (first_level, use_editor) = {
let mut args = std::env::args().skip(1);
@ -58,12 +52,12 @@ fn main() {
let mut app = App::new();
app.insert_resource(Msaa { samples: 4 })
.insert_resource(audio_event_sender)
.insert_resource(UseEditor(use_editor))
.add_state(AppState::Loading)
.insert_resource(game::FirstLevel(first_level))
.insert_resource(ClearColor(Color::BLACK))
.add_plugins(DefaultPlugins)
.add_plugin(audio_system::AudioSystemPlugin)
//.add_plugin(RapierDebugRenderPlugin::default())
//.add_plugin(bevy_inspector_egui::WorldInspectorPlugin::new())
.add_plugin(JsonAssetPlugin::<levels::StoredLevels>::new(&[