60 lines
2.2 KiB
GDScript
60 lines
2.2 KiB
GDScript
extends State
|
|
|
|
class_name DashState
|
|
|
|
var stateName : String = "Dash"
|
|
var cR : CharacterBody3D
|
|
|
|
var dash_timer : float = 0.0
|
|
|
|
func enter(charRef : CharacterBody3D):
|
|
cR = charRef
|
|
|
|
# 1. Задаем таймер длительности дэша из настроек игрока
|
|
dash_timer = cR.dash_duration
|
|
cR.dash_cooldown_timer = cR.dash_cooldown
|
|
cR.is_dashing = true
|
|
|
|
# 2. Определяем направление рывка
|
|
# Если игрок бежал — дэшим в сторону бега. Если стоял — строго вперед, куда смотрит камера
|
|
cR.dash_direction = cR.moveDirection
|
|
if cR.dash_direction == Vector3.ZERO:
|
|
cR.dash_direction = -cR.camHolder.global_transform.basis.z
|
|
|
|
cR.dash_direction.y = 0 # Чтобы не улетать в небо
|
|
cR.dash_direction = cR.dash_direction.normalized()
|
|
|
|
# 3. Включаем сочный эффект FOV на камере игрока
|
|
if cR.player_camera:
|
|
var tween = create_tween()
|
|
tween.tween_property(cR.player_camera, "fov", cR.normal_fov + 15.0, 0.1)
|
|
|
|
func physics_update(delta : float):
|
|
# Отсчитываем время действия дэша
|
|
dash_timer -= delta
|
|
|
|
if dash_timer <= 0:
|
|
# Рывок окончен! Возвращаем FOV камеры назад
|
|
cR.is_dashing = false
|
|
if cR.player_camera:
|
|
var tween = create_tween()
|
|
tween.tween_property(cR.player_camera, "fov", cR.normal_fov, 0.15)
|
|
|
|
# Плавно переходим обратно в ходьбу, бег или воздух в зависимости от того, где мы оказались
|
|
if cR.is_on_floor():
|
|
if cR.walkOrRun == "RunState":
|
|
transitioned.emit(self, "RunState")
|
|
else:
|
|
transitioned.emit(self, "WalkState")
|
|
else:
|
|
transitioned.emit(self, "InairState")
|
|
return
|
|
|
|
# Принудительно толкаем физическое тело игрока во время рывка
|
|
cR.velocity.x = cR.dash_direction.x * cR.dash_speed
|
|
cR.velocity.z = cR.dash_direction.z * cR.dash_speed
|
|
|
|
# Применяем гравитацию (опционально, чтобы игрок мог дэшиться в воздухе и плавно падать)
|
|
cR.gravityApply(delta)
|
|
cR.modifyPhysicsProperties()
|