Add hit component and effects; update player and enemy scenes to integrate hit feedback
This commit is contained in:
@@ -4,6 +4,8 @@ extends Node
|
||||
@export var sprite: Sprite2D
|
||||
@export var health_component: HealthComponent
|
||||
@export var hit_duration: float = 0.1
|
||||
@export var hit_fx: GPUParticles2D
|
||||
@export var flash_mode: bool = true
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -15,26 +17,41 @@ func _ready() -> void:
|
||||
printerr("No sprite assigned!")
|
||||
return
|
||||
|
||||
if sprite.material:
|
||||
if sprite.material and flash_mode:
|
||||
sprite.material = sprite.material.duplicate()
|
||||
|
||||
|
||||
func activate() -> void:
|
||||
if not flash_mode:
|
||||
return
|
||||
sprite.material.set_shader_parameter("enabled", true)
|
||||
|
||||
|
||||
func deactivate() -> void:
|
||||
if not flash_mode:
|
||||
return
|
||||
sprite.material.set_shader_parameter("enabled", false)
|
||||
|
||||
|
||||
func on_health_change(delta: float, _total_health: float) -> void:
|
||||
func on_health_change(delta: float, total_health: float) -> void:
|
||||
if delta < 0:
|
||||
activate()
|
||||
await get_tree().create_timer(hit_duration).timeout
|
||||
deactivate()
|
||||
|
||||
if total_health > 0:
|
||||
handle_hit_fx()
|
||||
|
||||
|
||||
func on_death() -> void:
|
||||
activate()
|
||||
await get_tree().create_timer(hit_duration).timeout
|
||||
deactivate()
|
||||
deactivate()
|
||||
|
||||
|
||||
func handle_hit_fx() -> void:
|
||||
if not hit_fx:
|
||||
return
|
||||
|
||||
hit_fx.restart()
|
||||
hit_fx.emitting = true
|
||||
|
@@ -7,9 +7,13 @@ extends Node
|
||||
@export var acceleration: float = 8.0
|
||||
@export var detection_area: Area2D
|
||||
@export var max_turn_rate: float = 180.0
|
||||
@export var wobble_strength := 5.0 # degrees
|
||||
@export var drag := 0.98
|
||||
@export var steering_lerp := 0.05 # low = sluggish
|
||||
|
||||
var target: Node2D = null
|
||||
var velocity: Vector2 = Vector2.ZERO
|
||||
var steering_direction: Vector2 = velocity.normalized()
|
||||
var target: Node2D = null
|
||||
var velocity: Vector2 = Vector2.ZERO
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -33,11 +37,19 @@ func _physics_process(delta: float) -> void:
|
||||
root.position += velocity * delta
|
||||
return
|
||||
|
||||
var to_target := (target.global_position - root.global_position).normalized()
|
||||
var angle_to_target := velocity.angle_to(to_target)
|
||||
var to_target := (target.global_position - root.global_position).normalized()
|
||||
steering_direction = steering_direction.lerp(to_target, steering_lerp)
|
||||
|
||||
var angle_to_target := velocity.angle_to(steering_direction)
|
||||
var max_angle := deg_to_rad(max_turn_rate) * delta
|
||||
var clamped_angle = clamp(angle_to_target, - max_angle, max_angle)
|
||||
velocity = velocity.rotated(clamped_angle).normalized() * velocity.length()
|
||||
|
||||
var wobble := deg_to_rad(randf_range(-wobble_strength, wobble_strength))
|
||||
clamped_angle += wobble
|
||||
|
||||
velocity = velocity.rotated(clamped_angle)
|
||||
|
||||
velocity *= drag
|
||||
|
||||
var desired_speed = min(max_speed, velocity.length() + acceleration * delta)
|
||||
velocity = velocity.normalized() * desired_speed
|
||||
|
@@ -91,4 +91,4 @@ func handle_direction(input_dir: float) -> Vector2:
|
||||
return Vector2.RIGHT
|
||||
elif input_dir < 0:
|
||||
return Vector2.LEFT
|
||||
return last_direction
|
||||
return last_direction
|
||||
|
Reference in New Issue
Block a user