parent
61446a0bcd
commit
c7f946a9e2
8 changed files with 189 additions and 8 deletions
@ -0,0 +1,86 @@ |
||||
extends Label3D |
||||
class_name DamageNumber |
||||
|
||||
## Floating damage number that animates upward and fades out |
||||
|
||||
@export var float_speed: float = 3.0 |
||||
@export var lifetime: float = 1.8 |
||||
@export var spread: float = 0.7 # Random horizontal spread |
||||
|
||||
var _elapsed: float = 0.0 |
||||
var _velocity: Vector3 = Vector3.ZERO |
||||
var _initial_scale: float = 1.5 |
||||
|
||||
func _ready(): |
||||
# Random horizontal spread |
||||
_velocity = Vector3( |
||||
randf_range(-spread, spread), |
||||
float_speed, |
||||
randf_range(-spread, spread) |
||||
) |
||||
|
||||
# Billboard mode so it always faces camera |
||||
billboard = BaseMaterial3D.BILLBOARD_ENABLED |
||||
|
||||
# Start with full opacity |
||||
modulate.a = 1.0 |
||||
|
||||
# Larger initial scale for impact |
||||
scale = Vector3.ONE * 0.5 |
||||
|
||||
func _process(delta): |
||||
_elapsed += delta |
||||
|
||||
# Move upward with velocity |
||||
position += _velocity * delta |
||||
_velocity.y -= delta * 1.5 # Slight gravity effect |
||||
|
||||
# Fade out over lifetime (keep visible longer, then quick fade) |
||||
var fade_progress = _elapsed / lifetime |
||||
if fade_progress < 0.7: |
||||
modulate.a = 1.0 |
||||
else: |
||||
var fade_amount = (fade_progress - 0.7) / 0.3 |
||||
modulate.a = 1.0 - fade_amount |
||||
|
||||
# Pop animation - quick scale up, then gentle scale down |
||||
if fade_progress < 0.15: |
||||
# Quick pop up |
||||
var scale_progress = fade_progress / 0.15 |
||||
var target_scale = _initial_scale * (0.5 + (0.5 * scale_progress)) |
||||
scale = Vector3.ONE * target_scale |
||||
elif fade_progress < 0.3: |
||||
# Slight bounce/overshoot |
||||
var bounce_progress = (fade_progress - 0.15) / 0.15 |
||||
var overshoot = sin(bounce_progress * PI) * 0.15 |
||||
var target_scale = _initial_scale * (1.0 + overshoot) |
||||
scale = Vector3.ONE * target_scale |
||||
else: |
||||
# Gentle shrink |
||||
var shrink_progress = (fade_progress - 0.3) / 0.7 |
||||
var target_scale = _initial_scale * (1.0 - (shrink_progress * 0.3)) |
||||
scale = Vector3.ONE * target_scale |
||||
|
||||
# Delete when lifetime expired |
||||
if _elapsed >= lifetime: |
||||
queue_free() |
||||
|
||||
## Set the damage number text and color |
||||
func set_damage(amount: float, was_blocked: bool = false): |
||||
text = str(int(amount)) |
||||
|
||||
if was_blocked: |
||||
# Bright yellow/orange for blocked damage with strong contrast |
||||
modulate = Color(1.0, 0.9, 0.0) # Bright yellow |
||||
outline_modulate = Color(0.3, 0.15, 0.0) # Dark brown/black outline |
||||
else: |
||||
# Vibrant red for normal damage with black outline |
||||
modulate = Color(1.0, 0.15, 0.15) # Bright red |
||||
outline_modulate = Color(0.1, 0.0, 0.0) # Almost black outline |
||||
|
||||
# Much larger and bolder |
||||
outline_size = 16 |
||||
font_size = 72 |
||||
|
||||
# Add depth with larger outline |
||||
pixel_size = 0.002 # Slightly larger pixels for better visibility |
||||
@ -0,0 +1 @@ |
||||
uid://c563plaqxfk5d |
||||
Loading…
Reference in new issue