add shaking when hitting projectile

This commit is contained in:
2025-07-04 06:40:14 +10:00
parent e61c7d0e95
commit ac73a649cf
2 changed files with 26 additions and 0 deletions

View File

@@ -4,6 +4,7 @@ extends Camera3D
@export_group("Positioning")
@export var _height_offset: float = 0.5
@export var _distance: float = 50
@export var _fov: float = 25
@export var _angle_degrees: Vector3 = Vector3(-35, -45, 0)
@export var _aim_offset_factor_mouse: float = 0.2
@export var _aim_offset_factor_controller: float = 0.5
@@ -15,8 +16,14 @@ extends Camera3D
@export var _damage_shake_amplitude: float = 0.02
@export var _damage_shake_frequency: float = 50
@export_group("Hit shake")
@export var _hit_shake_fov: float = 0.5
@export var _hit_shake_duration: float = 0.5
@export_exp_easing var _hit_shake_ease: float = 2
var _player_offsets: Dictionary[int, PlayerOffset]
var _damage_shake_time: float = 0
var _hit_shake_time: float = 0
@onready var _listener := $AudioListener3D as AudioListener3D
@@ -30,7 +37,9 @@ func _ready() -> void:
func _process(delta: float) -> void:
global_rotation_degrees = _angle_degrees
fov = _fov
_damage_shake(delta)
_hit_shake(delta)
func _physics_process(delta: float) -> void:
@@ -46,6 +55,7 @@ func _physics_process(delta: float) -> void:
func _connect_player_signals(player: Player) -> void:
player.stats.damaged.connect(_on_player_stats_damaged)
player.attack.did_hit.connect(_on_player_attack_did_hit)
func _follow(player: Player, delta: float) -> Vector3:
@@ -105,10 +115,24 @@ func _damage_shake(delta: float) -> void:
)
func _hit_shake(delta: float) -> void:
if _hit_shake_time <= 0:
return
_hit_shake_time -= delta
fov += (
_hit_shake_fov * ease(_hit_shake_time / _hit_shake_duration, _hit_shake_ease)
)
func _on_player_stats_damaged() -> void:
_damage_shake_time = _damage_shake_duration
func _on_player_attack_did_hit() -> void:
_hit_shake_time = _hit_shake_duration
class PlayerOffset:
var floor_height: float = 0
var aim_offset: Vector3 = Vector3.ZERO

View File

@@ -2,6 +2,7 @@ class_name PlayerAttack
extends Area3D
signal attacked
signal did_hit
enum Side { RIGHT, LEFT }
@@ -149,3 +150,4 @@ func _on_area_entered(node: Node3D) -> void:
if node is Projectile:
_hit_projectile(node as Projectile)
did_hit.emit()