particles: grow now over time
This commit is contained in:
parent
b01823c641
commit
4f71f833fb
|
@ -447,6 +447,7 @@ pub fn apply_input_to_player(
|
|||
),
|
||||
(With<actor::PlayerCamera>, Without<Camera>),
|
||||
>,
|
||||
mut ew_effect: EventWriter<visual::SpawnEffectEvent>,
|
||||
) {
|
||||
if settings.map_active || !settings.in_control() {
|
||||
return;
|
||||
|
@ -564,6 +565,16 @@ pub fn apply_input_to_player(
|
|||
engine.current_warmup =
|
||||
(engine.current_warmup + dt / engine.warmup_seconds).clamp(0.0, 1.0);
|
||||
play_thruster_sound = true;
|
||||
|
||||
// Visual effect
|
||||
if acceleration_total.length_squared() > 1e-4 {
|
||||
let thruster_direction = acceleration_total.normalize();
|
||||
let thruster_v = v.0 - 10.0 * thruster_direction;
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
duration: 1.0,
|
||||
class: visual::Effects::ThrusterParticle(pos.clone(), LinearVelocity::from(thruster_v)),
|
||||
});
|
||||
}
|
||||
} else {
|
||||
engine.current_warmup =
|
||||
(engine.current_warmup - dt / engine.warmup_seconds).clamp(0.0, 1.0);
|
||||
|
|
|
@ -476,16 +476,9 @@ fn debug(
|
|||
// >,
|
||||
mut achievement_tracker: ResMut<var::AchievementTracker>,
|
||||
vars: Res<var::GameVars>,
|
||||
q_playercam: Query<(&Position, &LinearVelocity), With<actor::PlayerCamera>>,
|
||||
mut ew_effect: EventWriter<visual::SpawnEffectEvent>,
|
||||
// materials: Query<(Entity, Option<&Name>, &Handle<Mesh>)>,
|
||||
) {
|
||||
if settings.dev_mode && keyboard_input.just_pressed(KeyCode::KeyP) {
|
||||
let (pos, v) = q_playercam.get_single().unwrap();
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
duration: 0.0,
|
||||
class: visual::Effects::ThrusterParticle(pos.clone(), v.clone()),
|
||||
});
|
||||
|
||||
// for (entity, _name, mesh) in &materials {
|
||||
// dbg!(mesh);
|
||||
|
|
|
@ -27,6 +27,7 @@ impl Plugin for VisualPlugin {
|
|||
app.add_systems(Update, spawn_effects);
|
||||
app.add_systems(Update, update_fadein);
|
||||
app.add_systems(Update, update_fadeout);
|
||||
app.add_systems(Update, update_grow);
|
||||
app.add_systems(Update, play_animations);
|
||||
// Blackout disabled for now
|
||||
//app.add_systems(Update, update_blackout);
|
||||
|
@ -45,9 +46,18 @@ pub enum Effects {
|
|||
//#[derive(Component)] pub struct BlackOutOverlay;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct FadeIn;
|
||||
pub struct FadeInSprite;
|
||||
#[derive(Component)]
|
||||
pub struct FadeOut;
|
||||
pub struct FadeOutSprite;
|
||||
#[derive(Component)]
|
||||
pub struct FadeOut3DObject;
|
||||
#[derive(Component)]
|
||||
pub struct Grow3DObject {
|
||||
pub start_time: f64,
|
||||
pub duration: f64,
|
||||
pub scale_start: f32,
|
||||
pub scale_end: f32,
|
||||
}
|
||||
#[derive(Component)]
|
||||
pub struct Effect {
|
||||
pub class: Effects,
|
||||
|
@ -126,7 +136,7 @@ pub fn spawn_effects(
|
|||
duration: effect.duration,
|
||||
start_time: now,
|
||||
},
|
||||
FadeIn,
|
||||
FadeInSprite,
|
||||
NodeBundle {
|
||||
style: style_fullscreen(),
|
||||
background_color: color.into(),
|
||||
|
@ -141,7 +151,7 @@ pub fn spawn_effects(
|
|||
duration: effect.duration,
|
||||
start_time: now,
|
||||
},
|
||||
FadeOut,
|
||||
FadeOutSprite,
|
||||
NodeBundle {
|
||||
style: style_fullscreen(),
|
||||
background_color: color.with_alpha(0.0).into(),
|
||||
|
@ -156,10 +166,17 @@ pub fn spawn_effects(
|
|||
bevy::pbr::NotShadowCaster,
|
||||
pos,
|
||||
v,
|
||||
Grow3DObject {
|
||||
start_time: now,
|
||||
duration: effect.duration,
|
||||
scale_start: 1.0,
|
||||
scale_end: 10.0,
|
||||
},
|
||||
world::DespawnAt(now + effect.duration * 3.0),
|
||||
world::DespawnOnPlayerDeath,
|
||||
actor::WantsToLookAt(cmd::ID_SPECIAL_PLAYERCAM.into()),
|
||||
PbrBundle {
|
||||
mesh: meshes.add(Mesh::from(Rectangle::new(1.0, 1.0))),
|
||||
mesh: meshes.add(Mesh::from(Rectangle::new(0.2, 0.2))),
|
||||
material: materials.add(StandardMaterial {
|
||||
base_color_texture: Some(texture),
|
||||
perceptual_roughness: 1.0,
|
||||
|
@ -176,7 +193,7 @@ pub fn spawn_effects(
|
|||
|
||||
pub fn update_fadein(
|
||||
mut commands: Commands,
|
||||
mut q_effect: Query<(Entity, &Effect, &mut BackgroundColor), With<FadeIn>>,
|
||||
mut q_effect: Query<(Entity, &Effect, &mut BackgroundColor), With<FadeInSprite>>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
for (entity, effect, mut bgcolor) in &mut q_effect {
|
||||
|
@ -192,7 +209,7 @@ pub fn update_fadein(
|
|||
|
||||
pub fn update_fadeout(
|
||||
mut commands: Commands,
|
||||
mut q_effect: Query<(Entity, &Effect, &mut BackgroundColor), With<FadeOut>>,
|
||||
mut q_effect: Query<(Entity, &Effect, &mut BackgroundColor), With<FadeOutSprite>>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
for (entity, effect, mut bgcolor) in &mut q_effect {
|
||||
|
@ -206,6 +223,30 @@ pub fn update_fadeout(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn update_grow(
|
||||
mut commands: Commands,
|
||||
mut q_object: Query<(Entity, &mut Transform, &Grow3DObject)>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
let now = time.elapsed_seconds_f64();
|
||||
for (entity, mut trans, data) in q_object.iter_mut() {
|
||||
let end_time = data.start_time + data.duration;
|
||||
if now > end_time {
|
||||
trans.scale = Vec3::splat(data.scale_end);
|
||||
commands.entity(entity).remove::<Grow3DObject>();
|
||||
}
|
||||
else if now < data.start_time {
|
||||
trans.scale = Vec3::splat(data.scale_start);
|
||||
}
|
||||
else {
|
||||
let progress = ((now - data.start_time) / data.duration) as f32;
|
||||
let scale = data.scale_start + progress * (data.scale_end - data.scale_start);
|
||||
trans.scale = Vec3::splat(scale);
|
||||
dbg!(progress, scale, trans.scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn play_animations(
|
||||
mut commands: Commands,
|
||||
mut players: Query<(Entity, &mut AnimationPlayer), Added<AnimationPlayer>>,
|
||||
|
|
16
src/world.rs
16
src/world.rs
|
@ -38,6 +38,7 @@ impl Plugin for WorldPlugin {
|
|||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(Startup, setup);
|
||||
app.add_systems(Update, handle_respawn.run_if(on_event::<RespawnEvent>()));
|
||||
app.add_systems(Update, handle_despawn_at.run_if(any_with_component::<DespawnAt>));
|
||||
app.add_plugins(PhysicsPlugins::default());
|
||||
//app.add_plugins(PhysicsDebugPlugin::default());
|
||||
app.insert_resource(Gravity(DVec3::splat(0.0)));
|
||||
|
@ -65,6 +66,8 @@ struct Asteroid;
|
|||
pub struct Star;
|
||||
#[derive(Component)]
|
||||
pub struct DespawnOnPlayerDeath;
|
||||
#[derive(Component)]
|
||||
pub struct DespawnAt(pub f64);
|
||||
#[derive(Event)]
|
||||
pub struct RespawnEvent;
|
||||
|
||||
|
@ -360,6 +363,19 @@ fn handle_despawn_asteroids(
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_despawn_at(
|
||||
mut commands: Commands,
|
||||
q_entity: Query<(Entity, &DespawnAt)>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
let now = time.elapsed_seconds_f64();
|
||||
for (entity, despawn_at) in &q_entity {
|
||||
if despawn_at.0 < now {
|
||||
commands.entity(entity).despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn handle_respawn(
|
||||
ew_spawn: EventWriter<cmd::SpawnEvent>,
|
||||
mut achievement_tracker: ResMut<var::AchievementTracker>,
|
||||
|
|
Loading…
Reference in a new issue