add player stats and camera shaking on damage

This commit is contained in:
2025-07-04 06:32:13 +10:00
parent 6df3d1a2dd
commit e61c7d0e95
5 changed files with 52 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
class_name MainCamera
extends Camera3D
@export_group("Positioning")
@export var _height_offset: float = 0.5
@export var _distance: float = 50
@export var _angle_degrees: Vector3 = Vector3(-35, -45, 0)
@@ -8,7 +9,14 @@ extends Camera3D
@export var _aim_offset_factor_controller: float = 0.5
@export var _aim_damping: float = 1
@export_group("Damage shake")
@export var _damage_shake_duration: float = 0.5
@export_exp_easing var _damage_shake_ease: float = 2
@export var _damage_shake_amplitude: float = 0.02
@export var _damage_shake_frequency: float = 50
var _player_offsets: Dictionary[int, PlayerOffset]
var _damage_shake_time: float = 0
@onready var _listener := $AudioListener3D as AudioListener3D
@@ -16,6 +24,13 @@ var _player_offsets: Dictionary[int, PlayerOffset]
func _ready() -> void:
Referencer.main_camera = self
_listener.make_current()
for player in Referencer.players:
_connect_player_signals(player)
func _process(delta: float) -> void:
global_rotation_degrees = _angle_degrees
_damage_shake(delta)
func _physics_process(delta: float) -> void:
@@ -25,11 +40,14 @@ func _physics_process(delta: float) -> void:
follow_position /= Referencer.players_count
follow_position += Vector3.UP * _height_offset
global_rotation_degrees = _angle_degrees
global_position = follow_position + transform.basis.z * _distance
_listener.global_position = follow_position
func _connect_player_signals(player: Player) -> void:
player.stats.damaged.connect(_on_player_stats_damaged)
func _follow(player: Player, delta: float) -> Vector3:
var id := player.get_instance_id()
if not _player_offsets.has(id):
@@ -73,6 +91,24 @@ func _follow(player: Player, delta: float) -> Vector3:
return follow_position
func _damage_shake(delta: float) -> void:
if _damage_shake_time <= 0:
return
_damage_shake_time -= delta
var shake_value := (
sin(_damage_shake_frequency * _damage_shake_time) * _damage_shake_amplitude
)
global_rotation.z += (
shake_value
* ease(_damage_shake_time / _damage_shake_duration, _damage_shake_ease)
)
func _on_player_stats_damaged() -> void:
_damage_shake_time = _damage_shake_duration
class PlayerOffset:
var floor_height: float = 0
var aim_offset: Vector3 = Vector3.ZERO

View File

@@ -7,6 +7,7 @@ extends CharacterBody3D
@export var _respawn_height: float = -5
@export var _collision_debug_material: Material
var stats: PlayerStats = PlayerStats.new()
var movement: PlayerMovement = PlayerMovement.new()
var aiming: PlayerAiming = PlayerAiming.new()

View File

@@ -0,0 +1,10 @@
class_name PlayerStats
signal damaged
var health: int = 6
func damage() -> void:
health -= 1
damaged.emit()

View File

@@ -0,0 +1 @@
uid://clks186ll0joi

View File

@@ -43,9 +43,7 @@ func _physics_process(delta: float) -> void:
var speed_squash := clampf(
_velocity.length() / _speed_stretch_factor, 0, MAX_STRETCH
)
_model_base.scale = Vector3(
1 - speed_squash, 1 - speed_squash, 1 + speed_squash
)
_model_base.scale = Vector3(1 - speed_squash, 1 - speed_squash, 1 + speed_squash)
func init(velocity: Vector3, start_position: Vector3, lifetime: float = 10) -> void:
@@ -62,6 +60,8 @@ func set_velocity(velocity: Vector3) -> void:
func _on_body_entered(node: Node3D) -> void:
if node is Player:
queue_free()
var player := node as Player
player.stats.damage()
return
if node is CollisionObject3D: