xrjamfeb2025/scenes/basic_movement_demo/objects/damage_area.gd

60 lines
1.2 KiB
GDScript

extends Node3D
# Damaging flag
var _damaging : bool = false
# Damage cycle
var _damage_cycle : float = 0.0
func _exit_tree() -> void:
_stop_damage()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta : float) -> void:
# Disable processing if not doing damage
if not _damaging:
set_process(false)
return
# Advance the cycle counter
_damage_cycle = fmod(_damage_cycle + delta, 1.0)
# Generate the cycling alpha value
var alpha := cos(_damage_cycle * PI * 2)
alpha = remap(alpha, 1.0, -1.0, 0.0, 0.5)
# Fade cycling to red tint
var color := Color(1.0, 0.0, 0.0, alpha)
XRToolsFade.set_fade(self, color)
func _on_area_3d_body_entered(body : Node3D):
# Skip if not the player body
if not body.is_in_group("player_body"):
return
_start_damange()
func _on_area_3d_body_exited(body : Node3D):
# Skip if not the player body
if not body.is_in_group("player_body"):
return
_stop_damage()
func _start_damange() -> void:
# Set damaging
_damaging = true
_damage_cycle = 0.0
set_process(true)
func _stop_damage() -> void:
# Cancel any current damaging effect
_damaging = false
XRToolsFade.set_fade(self, Color.TRANSPARENT)