From d66409ebaebb2eab304d2568554d33a40bd2a22e Mon Sep 17 00:00:00 2001 From: copygirl Date: Sun, 16 May 2021 16:45:40 +0200 Subject: [PATCH] Implement simple hit decals - Give super soaker custom weapon properties - Reduce speed at which Spread and recoil recovers - Use LIFE_TIME and FADE_TIME constants --- gfx/hit_decal.png | Bin 0 -> 6189 bytes gfx/hit_decal.png.import | 34 ++++++++ scene/HitDecal.tscn | 182 +++++++++++++++++++++++++++++++++++++++ scene/Player.tscn | 9 ++ src/Items/Weapon.cs | 4 +- src/Objects/Bullet.cs | 22 ++++- src/Objects/HitDecal.cs | 38 ++++++++ 7 files changed, 283 insertions(+), 6 deletions(-) create mode 100644 gfx/hit_decal.png create mode 100644 gfx/hit_decal.png.import create mode 100644 scene/HitDecal.tscn create mode 100644 src/Objects/HitDecal.cs diff --git a/gfx/hit_decal.png b/gfx/hit_decal.png new file mode 100644 index 0000000000000000000000000000000000000000..74ef0dc772d1826751708c2e6943c2a4980e86f4 GIT binary patch literal 6189 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"res://scene/HitDecal.tscn"); public Vector2 Direction { get; } public int EffectiveRange { get; } @@ -12,7 +14,7 @@ public class Bullet : Node2D public Color Color { get; } private readonly Vector2 _startPosition; - private TimeSpan _age; + private TimeSpan _age = TimeSpan.Zero; private float _distance; public Bullet(Vector2 position, Vector2 direction, @@ -26,6 +28,16 @@ public class Bullet : Node2D Color = color; } + protected void OnCollide(CollisionObject2D obj, Vector2 hitPosition) + { + var sprite = obj.GetNodeOrNull("Sprite"); + if (sprite == null) return; + + var hole = HIT_DECAL.Init(); + var color = new Color(Color, (1 + Color.a) / 2); + hole.Add(sprite, hitPosition, color); + } + public override void _Ready() { if (this.GetGame() is Server) Visible = false; } @@ -33,8 +45,8 @@ public class Bullet : Node2D { _age += TimeSpan.FromSeconds(delta); - if (_age > TRAIL_DURATION) { - Modulate = new Color(Modulate, Modulate.a - delta * 2); + if (_age > LIFE_TIME) { + Modulate = new Color(Modulate, Modulate.a - delta / (float)FADE_TIME.TotalSeconds); if (Modulate.a <= 0) this.RemoveFromParent(); } } @@ -50,6 +62,8 @@ public class Bullet : Node2D if (collision.Count != 0) { Position = (Vector2)collision["position"]; _distance = _startPosition.DistanceTo(Position); + var obj = (CollisionObject2D)collision["collider"]; + OnCollide(obj, Position - obj.Position); SetPhysicsProcess(false); } diff --git a/src/Objects/HitDecal.cs b/src/Objects/HitDecal.cs new file mode 100644 index 0000000..abce850 --- /dev/null +++ b/src/Objects/HitDecal.cs @@ -0,0 +1,38 @@ +using System; +using Godot; + +// TODO: When spawned, add to multiple nearby sprites. +public class HitDecal : Sprite +{ + private static readonly TimeSpan LIFE_TIME = TimeSpan.FromSeconds(5.0); + private static readonly TimeSpan FADE_TIME = TimeSpan.FromSeconds(5.0); + + private TimeSpan _age = TimeSpan.Zero; + private float _fadeFactor; + + public void Add(Sprite sprite, Vector2 hitVec, Color color) + { + Position = (hitVec - Texture.GetSize() / 2).Round(); + var offset = Position + sprite.Texture.GetSize() / 2; + + ShaderMaterial material; + Material = material = (ShaderMaterial)Material.Duplicate(); + material.SetShaderParam("offset", new Vector3(offset.x, offset.y, 0)); + material.SetShaderParam("mask", sprite.Texture); + + Modulate = color; + _fadeFactor = color.a; + + sprite.AddChild(this); + } + + public override void _Process(float delta) + { + _age += TimeSpan.FromSeconds(delta); + if (_age > LIFE_TIME) { + var dec = delta / (float)FADE_TIME.TotalSeconds * _fadeFactor; + Modulate = new Color(Modulate, Modulate.a - dec); + if (Modulate.a <= 0) this.RemoveFromParent(); + } + } +}