Normalize particle velocity based on max duration

This commit is contained in:
Opelkuh 2021-09-18 23:45:58 +02:00
parent 846cde53b3
commit ef530ed87c
2 changed files with 8 additions and 5 deletions

View File

@ -29,7 +29,7 @@ private void load()
AddToggleStep("toggle spawning", value => spewer.Active.Value = value);
AddSliderStep("particle gravity", 0f, 1f, 0f, value => spewer.Gravity = value);
AddSliderStep("particle velocity", 0f, 1f, 0.25f, value => spewer.MaxVelocity = value);
AddSliderStep("particle velocity", 0f, 1f, 0.5f, value => spewer.MaxVelocity = value);
AddStep("move to new location", () =>
{
spewer.TransformTo(nameof(spewer.SpawnPosition), new Vector2(RNG.NextSingle(), RNG.NextSingle()), 1000, Easing.Out);

View File

@ -82,6 +82,8 @@ private class ParticleSpewerDrawNode : SpriteDrawNode
protected new ParticleSpewer Source => (ParticleSpewer)base.Source;
private readonly float maxLifetime;
private float currentTime;
private float gravity;
private Axes relativePositionAxes;
@ -91,6 +93,7 @@ public ParticleSpewerDrawNode(Sprite source)
: base(source)
{
particles = new FallingParticle[Source.particles.Length];
maxLifetime = (float)Source.maxLifetime;
}
public override void ApplyState()
@ -121,7 +124,7 @@ protected override void Blit(Action<TexturedVertex2D> vertexAction)
var alpha = p.AlphaAtTime(timeSinceStart);
if (alpha <= 0) continue;
var pos = p.PositionAtTime(timeSinceStart, gravity);
var pos = p.PositionAtTime(timeSinceStart, gravity, maxLifetime);
var scale = p.ScaleAtTime(timeSinceStart);
var angle = p.AngleAtTime(timeSinceStart);
@ -187,12 +190,12 @@ protected struct FallingParticle
public float AngleAtTime(float timeSinceStart) => StartAngle + (EndAngle - StartAngle) * progressAtTime(timeSinceStart);
public Vector2 PositionAtTime(float timeSinceStart, float gravity)
public Vector2 PositionAtTime(float timeSinceStart, float gravity, float maxDuration)
{
var progress = progressAtTime(timeSinceStart);
var currentGravity = new Vector2(0, gravity * Duration / 1000 * progress);
var currentGravity = new Vector2(0, gravity * Duration / maxDuration * progress);
return StartPosition + (Velocity + currentGravity) * timeSinceStart / 1000;
return StartPosition + (Velocity + currentGravity) * timeSinceStart / maxDuration;
}
private float progressAtTime(float timeSinceStart) => Math.Clamp(timeSinceStart / Duration, 0, 1);