add player stats and camera shaking on damage
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
10
scripts/player/player_stats.gd
Normal file
10
scripts/player/player_stats.gd
Normal file
@@ -0,0 +1,10 @@
|
||||
class_name PlayerStats
|
||||
|
||||
signal damaged
|
||||
|
||||
var health: int = 6
|
||||
|
||||
|
||||
func damage() -> void:
|
||||
health -= 1
|
||||
damaged.emit()
|
||||
1
scripts/player/player_stats.gd.uid
Normal file
1
scripts/player/player_stats.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://clks186ll0joi
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user