From 5ac4b4711cd7b872dfad3bb419da5ceea586f74e Mon Sep 17 00:00:00 2001 From: tuxmain Date: Thu, 25 Aug 2022 09:30:47 +0200 Subject: [PATCH] Rotating filter --- assets/bevy.png | Bin 0 -> 8873 bytes src/filters.rs | 40 ++++++++++++++++++++++++++++++++++------ src/game.rs | 16 +++------------- src/levels.rs | 1 + src/levels/level1.rs | 19 +++++++++++++++++-- src/main.rs | 6 +++--- 6 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 assets/bevy.png diff --git a/assets/bevy.png b/assets/bevy.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd3f1e81e61254a236de80ea42f40f25a7ed2dc GIT binary patch literal 8873 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 Color { + match self { + PassThroughFilter::Absorbing(filter_color) => Vec4::from(color) + .mul_add( + -Vec4::from(*filter_color) * Vec4::from([1., 1., 1., 0.]), + Vec4::from(color), + ) + .into(), + PassThroughFilter::Rotating(filter_angle) => { + let mut hsla = color.as_hsla_f32(); + hsla[0] = (hsla[0] + filter_angle) % 360.; + Color::hsla(hsla[0], hsla[1], hsla[2], hsla[3]) + } + } + } } #[derive(Bundle)] pub struct AbsorbingFilter { - pub color: FilterColor, #[bundle] pub mesh: ColorMesh2dBundle, pub collider: Collider, pub sensor: Sensor, - pub filter_type: PassThroughFilter, + pub filter: PassThroughFilter, +} + +#[derive(Bundle)] +pub struct RotatingFilter { + #[bundle] + pub sprite: SpriteBundle, + pub collider: Collider, + pub sensor: Sensor, + pub filter: PassThroughFilter, + pub velocity: Velocity, + pub rigid_body: RigidBody, } diff --git a/src/game.rs b/src/game.rs index f908016..484dd21 100644 --- a/src/game.rs +++ b/src/game.rs @@ -184,7 +184,7 @@ fn collision_event_system( &mut Handle, Option<&Player>, )>, - pass_through_filter_query: Query<(&PassThroughFilter, &FilterColor)>, + pass_through_filter_query: Query<&PassThroughFilter>, mut app_state: ResMut>, audio: Res>, ) { @@ -231,21 +231,11 @@ fn collision_event_system( audio.send(AudioMsg::Fusion).ok(); } } else if *flags == CollisionEventFlags::SENSOR { - if let ( - Ok((mut c_color, _c_transform, mut c_material, c_player)), - Ok((filter, filter_color)), - ) = ( + 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 = match filter { - PassThroughFilter::Absorbing => Vec4::from(c_color.0) - .mul_add( - -Vec4::from(filter_color.0) * Vec4::from([1., 1., 1., 0.]), - Vec4::from(c_color.0), - ) - .into(), - }; + c_color.0 = filter.apply(c_color.0); *c_material = materials.add(ColorMaterial::from(c_color.0)); if c_player.is_some() { diff --git a/src/levels.rs b/src/levels.rs index a669d0f..ac00218 100644 --- a/src/levels.rs +++ b/src/levels.rs @@ -56,6 +56,7 @@ pub fn post_setup_level( &character_meshes, &mut materials, &audio, + &asset_server, ), _ => game_over::setup(&mut commands, &asset_server), } diff --git a/src/levels/level1.rs b/src/levels/level1.rs index f26df88..f2d7a73 100644 --- a/src/levels/level1.rs +++ b/src/levels/level1.rs @@ -9,6 +9,7 @@ pub fn setup( character_meshes: &Res, materials: &mut ResMut>, audio: &Res>, + asset_server: &Res, ) { commands .spawn_bundle(ColorMesh2dBundle { @@ -53,7 +54,6 @@ pub fn setup( commands .spawn_bundle(AbsorbingFilter { - color: FilterColor(Color::RED), mesh: ColorMesh2dBundle { mesh: meshes .add(Mesh::from(Quad { @@ -67,7 +67,22 @@ pub fn setup( }, collider: Collider::cuboid(64., 8.), sensor: Sensor, - filter_type: PassThroughFilter::Absorbing, + filter: PassThroughFilter::Absorbing(Color::RED), + }) + .insert(Level); + + commands + .spawn_bundle(RotatingFilter { + sprite: SpriteBundle { + texture: asset_server.get_handle("bevy.png"), + transform: Transform::from_xyz(256., -224., 2.), + ..Default::default() + }, + collider: Collider::ball(32.), + sensor: Sensor, + filter: PassThroughFilter::Rotating(45.), + velocity: Velocity::angular(1.), + rigid_body: RigidBody::KinematicVelocityBased, }) .insert(Level); } diff --git a/src/main.rs b/src/main.rs index 8f78e79..08b60fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,12 +49,12 @@ fn setup(mut commands: Commands, mut windows: ResMut, asset_server: Res .unwrap() .set_title(String::from("Bevyjam")); - #[cfg(not(target_arch = "wasm32"))] - let font: Handle = asset_server.load("UacariLegacy-Thin.ttf"); - #[cfg(target_arch = "wasm32")] let font: Handle = asset_server.load("UacariLegacy-Thin.ttf"); commands.insert_resource(font); + let bevy_icon: Handle = asset_server.load("bevy.png"); + commands.insert_resource(bevy_icon); + commands.spawn_bundle(Camera2dBundle::default()); commands.insert_resource(AmbientLight { color: Color::WHITE,