Color filter
This commit is contained in:
parent
b42a032cfd
commit
2a4625269f
4 changed files with 112 additions and 75 deletions
47
src/game.rs
47
src/game.rs
|
|
@ -12,6 +12,7 @@ use bevy::{
|
|||
sprite::Mesh2dHandle,
|
||||
};
|
||||
use bevy_rapier2d::prelude::*;
|
||||
use rapier2d::geometry::CollisionEventFlags;
|
||||
|
||||
pub enum AudioMsg {
|
||||
Color([f32; 3]),
|
||||
|
|
@ -154,7 +155,6 @@ pub fn spawn_character(
|
|||
.insert(CharacterColor(color))
|
||||
.insert(RigidBody::Dynamic)
|
||||
.insert(Collider::cuboid(32., 32.))
|
||||
.insert(ExternalForce::default())
|
||||
.insert(Velocity::default())
|
||||
.insert(GravityScale(10.0))
|
||||
.insert(LockedAxes::ROTATION_LOCKED)
|
||||
|
|
@ -163,7 +163,6 @@ pub fn spawn_character(
|
|||
linear_damping: 0.5,
|
||||
angular_damping: 0.5,
|
||||
})
|
||||
.insert(ExternalImpulse::default())
|
||||
.insert(ActiveEvents::COLLISION_EVENTS);
|
||||
|
||||
if is_player {
|
||||
|
|
@ -179,7 +178,13 @@ fn collision_event_system(
|
|||
character_meshes: Res<CharacterMeshes>,
|
||||
mut materials: ResMut<Assets<ColorMaterial>>,
|
||||
mut collision_events: EventReader<CollisionEvent>,
|
||||
character_query: Query<(&CharacterColor, &Transform, Option<&Player>)>,
|
||||
mut character_query: Query<(
|
||||
&mut CharacterColor,
|
||||
&Transform,
|
||||
&mut Handle<ColorMaterial>,
|
||||
Option<&Player>,
|
||||
)>,
|
||||
pass_through_filter_query: Query<(&PassThroughFilter, &FilterColor)>,
|
||||
mut app_state: ResMut<State<AppState>>,
|
||||
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
|
||||
) {
|
||||
|
|
@ -187,8 +192,8 @@ fn collision_event_system(
|
|||
if let CollisionEvent::Started(e1, e2, flags) = collision_event {
|
||||
if flags.is_empty() {
|
||||
if let (
|
||||
Ok((c1_color, c1_transform, c1_player)),
|
||||
Ok((c2_color, c2_transform, c2_player)),
|
||||
Ok((c1_color, c1_transform, _c1_material, c1_player)),
|
||||
Ok((c2_color, c2_transform, _c2_material, c2_player)),
|
||||
) = (character_query.get(*e1), character_query.get(*e2))
|
||||
{
|
||||
commands.entity(*e1).despawn_recursive();
|
||||
|
|
@ -225,6 +230,34 @@ 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)),
|
||||
) = (
|
||||
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_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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -300,10 +333,10 @@ fn player_movement_system(
|
|||
}
|
||||
|
||||
fn character_particle_effect_system(
|
||||
characters: Query<(&Transform, &CharacterColor), With<Player>>,
|
||||
player_character: Query<(&Transform, &CharacterColor), With<Player>>,
|
||||
mut particle_effect: ResMut<crate::particle_effect::ParticleEffectResource>,
|
||||
) {
|
||||
for (transform, color) in characters.iter() {
|
||||
if let Ok((transform, color)) = player_character.get_single() {
|
||||
particle_effect.translation = transform.translation;
|
||||
particle_effect.color = color.0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue