Damage numbers and knockback
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user