точно есть дэшм
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user