batching damage text
							parent
							
								
									673bebcabf
								
							
						
					
					
						commit
						b18b011133
					
				|  | @ -104,6 +104,8 @@ public partial class Character : CharacterBody2D, IFaction | |||
| 
 | ||||
|     public AnimationPlayer AttackAnimation { get; set; } | ||||
| 
 | ||||
|     private UI.DamageText _curDamageText; | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         // TODO: 80+ char line | ||||
|  | @ -268,6 +270,20 @@ public partial class Character : CharacterBody2D, IFaction | |||
|         float knockback, | ||||
|         Vector2 knockbackDir = default) => damage; | ||||
| 
 | ||||
|     protected void CreateDamageText(float damage) | ||||
|     { | ||||
|         // create damage text | ||||
|         var textScene = GD.Load<PackedScene>("res://UI/DamageText.tscn"); | ||||
|         if (_curDamageText is null || !IsInstanceValid(_curDamageText)) | ||||
|         { | ||||
|             _curDamageText = textScene.Instantiate<UI.DamageText>(); | ||||
|             this.GetWorld().CurrentMap.AddChild(_curDamageText); | ||||
|         } | ||||
|         _curDamageText.Damage += damage; | ||||
|         _curDamageText.Timer.Start(); | ||||
|         _curDamageText.GlobalPosition = GlobalPosition; | ||||
|         _curDamageText.ShowText(); | ||||
|     } | ||||
| 
 | ||||
|     protected virtual void OnReceivedDamage( | ||||
|         float damage, | ||||
|  | @ -281,7 +297,8 @@ public partial class Character : CharacterBody2D, IFaction | |||
|         } | ||||
| 
 | ||||
|         float oldHealth = Health; | ||||
|         Health -= ReceiveDamage(damage, inflictor, knockback, knockbackDir); | ||||
|         damage = ReceiveDamage(damage, inflictor, knockback, knockbackDir); | ||||
|         Health -= damage; | ||||
| 
 | ||||
|         var hurtParticles = GetNode<GpuParticles2D>("Effects/HurtParticles"); | ||||
|         if (hurtParticles is not null) | ||||
|  | @ -289,15 +306,9 @@ public partial class Character : CharacterBody2D, IFaction | |||
|             hurtParticles.SetDirection(knockbackDir); | ||||
|         } | ||||
| 
 | ||||
|         // create damage text | ||||
|         var textScene = GD.Load<PackedScene>("res://UI/FloatingText.tscn"); | ||||
|         var instance = textScene.Instantiate<UI.FloatingText>(); | ||||
|         instance.Text = Mathf.Round(damage).ToString(); | ||||
|         instance.GlobalPosition = GlobalPosition; | ||||
|         this.GetAncestor<TileMap>().AddChild(instance); | ||||
|         CreateDamageText(damage); | ||||
| 
 | ||||
|         // apply knockback | ||||
| 
 | ||||
|         ApplyImpulse(knockbackDir.Normalized() * knockback); | ||||
| 
 | ||||
|         // play damage animation | ||||
|  |  | |||
|  | @ -0,0 +1,18 @@ | |||
| using Godot; | ||||
| 
 | ||||
| namespace SupaLidlGame.UI; | ||||
| 
 | ||||
| public partial class DamageText : FloatingText | ||||
| { | ||||
|     private float _damage = 0; | ||||
| 
 | ||||
|     public float Damage | ||||
|     { | ||||
|         get => _damage; | ||||
|         set | ||||
|         { | ||||
|             _damage = value; | ||||
|             Text = Mathf.Round(value).ToString(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| [gd_scene load_steps=3 format=3 uid="uid://b05ormmtofbw1"] | ||||
| 
 | ||||
| [ext_resource type="PackedScene" uid="uid://be80n7mxp62jd" path="res://UI/FloatingText.tscn" id="1_dggpv"] | ||||
| [ext_resource type="Script" path="res://UI/DamageText.cs" id="2_psgc1"] | ||||
| 
 | ||||
| [node name="FloatingText" instance=ExtResource("1_dggpv")] | ||||
| z_index = 16 | ||||
| script = ExtResource("2_psgc1") | ||||
|  | @ -5,17 +5,55 @@ namespace SupaLidlGame.UI; | |||
| 
 | ||||
| public partial class FloatingText : Node2D | ||||
| { | ||||
|     private Label _label; | ||||
|     private string _text; | ||||
| 
 | ||||
|     [Export] | ||||
|     public string Text { get; set; } | ||||
|     public string Text | ||||
|     { | ||||
|         get => _text; | ||||
|         set | ||||
|         { | ||||
|             _text = value; | ||||
|             if (_label is not null) | ||||
|             { | ||||
|                 _label.Text = value; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public Timer Timer { get; set; } | ||||
| 
 | ||||
|     protected Label _label; | ||||
| 
 | ||||
|     protected Tween _tween; | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         _label = GetNode<Label>("Label"); | ||||
|         _label.Text = Text; | ||||
|         _label.Text = _text; | ||||
| 
 | ||||
|         Tween tween = GetTree().CreateTween() | ||||
|         Timer = GetNode<Timer>("Timer"); | ||||
|         Timer.Timeout += Die; | ||||
| 
 | ||||
|         ShowText(); | ||||
|     } | ||||
| 
 | ||||
|     public void Reset() | ||||
|     { | ||||
|         Modulate = Colors.White; | ||||
|         Scale = Vector2.One * 0.5f; | ||||
|     } | ||||
| 
 | ||||
|     public void ShowText() | ||||
|     { | ||||
|         Reset(); | ||||
| 
 | ||||
|         if (_tween is not null && _tween.IsRunning()) | ||||
|         { | ||||
|             _tween.Kill(); | ||||
|         } | ||||
| 
 | ||||
|         _tween = GetTree().CreateTween() | ||||
|             .SetEase(Tween.EaseType.Out) | ||||
|             .SetTrans(Tween.TransitionType.Quint) | ||||
|             .SetParallel(); | ||||
|  | @ -27,23 +65,19 @@ public partial class FloatingText : Node2D | |||
|             return (float)rng.NextDouble() * (max - min) + min; | ||||
|         } | ||||
| 
 | ||||
|         GD.Print(GlobalPosition); | ||||
|         Position += new Vector2(randomFloat(-8, 8), 0); | ||||
|         var endPos = Position + new Vector2(0, randomFloat(-16, -8)); | ||||
|         var endMod = new Color(1, 1, 1, 0); | ||||
|         var endScale = Scale * 0.5f; | ||||
| 
 | ||||
|         tween.TweenProperty(this, "position", endPos, 0.5f); | ||||
|         tween.SetTrans(Tween.TransitionType.Linear); | ||||
|         tween.TweenProperty(this, "modulate", endMod, 0.5f).SetDelay(1.0f); | ||||
|         tween.TweenProperty(this, "scale", endScale, 0.5f).SetDelay(1.0f); | ||||
|         tween.TweenCallback(new Callable(this, nameof(OnTweenFinished))) | ||||
|             .SetDelay(2.5f); | ||||
| 
 | ||||
|         base._Ready(); | ||||
|         _tween.TweenProperty(this, "position", endPos, 0.5f); | ||||
|         _tween.SetTrans(Tween.TransitionType.Linear); | ||||
|         _tween.TweenProperty(this, "modulate", endMod, 0.5f).SetDelay(1.0f); | ||||
|         _tween.TweenProperty(this, "scale", endScale, 0.5f).SetDelay(1.0f); | ||||
|         _tween.Play(); | ||||
|     } | ||||
| 
 | ||||
|     public void OnTweenFinished() | ||||
|     public void Die() | ||||
|     { | ||||
|         QueueFree(); | ||||
|     } | ||||
|  |  | |||
|  | @ -5,10 +5,11 @@ | |||
| 
 | ||||
| [sub_resource type="LabelSettings" id="LabelSettings_gs6ch"] | ||||
| font = ExtResource("1_yns15") | ||||
| font_color = Color(1, 0.792157, 0, 1) | ||||
| font_color = Color(0.941176, 0.843137, 0.470588, 1) | ||||
| outline_size = 2 | ||||
| outline_color = Color(0.635294, 0.415686, 0, 1) | ||||
| shadow_color = Color(0, 0, 0, 1) | ||||
| outline_color = Color(0.713726, 0.372549, 0.105882, 1) | ||||
| shadow_size = 2 | ||||
| shadow_color = Color(0.176471, 0.0901961, 0.172549, 1) | ||||
| 
 | ||||
| [node name="FloatingText" type="Node2D"] | ||||
| scale = Vector2(0.5, 0.5) | ||||
|  | @ -24,3 +25,7 @@ text = "gruppa krovi" | |||
| label_settings = SubResource("LabelSettings_gs6ch") | ||||
| horizontal_alignment = 1 | ||||
| vertical_alignment = 1 | ||||
| 
 | ||||
| [node name="Timer" type="Timer" parent="."] | ||||
| wait_time = 2.5 | ||||
| autostart = true | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue